Answers:
尽管JS实现可能在内部跟踪这样的值,但是没有标准的方法来获取它。
过去,Mozilla的Javascript变体公开了非标准__count__
,但在1.8.5版中已将其删除。
对于跨浏览器脚本编写,您必须明确地遍历属性并检查hasOwnProperty()
:
function countProperties(obj) {
var count = 0;
for(var prop in obj) {
if(obj.hasOwnProperty(prop))
++count;
}
return count;
}
在具有ECMAScript 5功能的实现中,这也可以写成(Avi Flax的荣誉)
function countProperties(obj) {
return Object.keys(obj).length;
}
请记住,您还将错过不可枚举的属性(例如,数组的length
)。
如果您使用的是jQuery,Prototype,Mootools,$ whatthe-the-newest-hype之类的框架,请检查它们是否带有自己的collections API,这可能比使用本机JS对象更好地解决您的问题。
__count__
不见了:(
hasOwnProperty()
?
AFAIK,除非您切换到阵列,否则无法可靠地执行此操作。老实说,这似乎并不奇怪-在我看来,数组是可数的,而对象却不是。
可能最接近的是这样的
// Monkey patching on purpose to make a point
Object.prototype.length = function()
{
var i = 0;
for ( var p in this ) i++;
return i;
}
alert( {foo:"bar", bar: "baz"}.length() ); // alerts 3
但这会产生问题,或者至少会带来问题。计算所有用户创建的属性,包括_length函数本身!在这个简单的示例中,您可以通过使用常规函数来避免这种情况,但这并不意味着您可以阻止其他脚本执行此操作。所以你会怎么做?忽略函数属性?
Object.prototype.length = function()
{
var i = 0;
for ( var p in this )
{
if ( 'function' == typeof this[p] ) continue;
i++;
}
return i;
}
alert( {foo:"bar", bar: "baz"}.length() ); // alerts 2
最后,我认为您可能应该放弃使对象可计数的想法,并想出另一种方法来做您正在做的事情。
数字/长度/维数的概念对于一个对象并没有多大意义,需要它表明您真的对我想要一个数组。
编辑:指向我指出您想要一个O(1)。据我所知,恐怕还没有这种方法。