2013-02-25 133 views
2

我需要获取js物品的物业数量。获取js物品的物品数量

我搜索,发现类似这样的解决方案:

var foo = {"key1": "value1", "key2": "value2", "key3": "value3"}; 
var count = 0; 
for (var k in foo) { 
    if (foo.hasOwnProperty(k)) { 
     ++count; 
    } 
} 

问:为什么需要条件if (foo.hasOwnProperty(k)) {

我认为这段代码必须始终有效,没有这种情况。

我错了?

+0

的http:// stackoverflow.com/questions/8539921/javascript-is-a-member-defined希望可以帮助 – 2013-02-25 14:19:49

+0

只需执行Object.keys(foo).length',然后为旧浏览器添加垫片即可。 – 2013-02-25 14:57:22

回答

1

某些对象具有由系统添加的属性(即原型)。

您通常不希望对这些进行计数。你问的条件将确保你只计算属于你的对象本身的属性。

所以,如果你打算做一个函数,将返回任何对象的计数,它可能更好地包括条件,否则你不一定需要。

2

看到这个:How to efficiently count the number of keys/properties of an object in JavaScript?

是的,hasOwnProperty方法真的reduntant这里。

无论如何,为什么你需要得到属性计数?恐怕你正在解决一些不好的方法。

+0

如果您想避免对继承的成员进行计数,则不是多余的。希望没有人会将成员添加到Object.prototype中,但它确实发生了(包括在流行的JavaScript框架的旧版本中)。 – 2013-02-25 14:28:19

+0

@ user1660584'无论如何,为什么你需要得到属性计数?恐怕你正在解决一些不好的方法。“---我从php到js获得了关联数组,我需要在js中获得这个数组。谢谢,谢谢大家 – RIKI 2013-02-25 14:44:07

1

这是为了防止您计算遗传成员。

如果你这样做(不推荐):

Object.prototype.x = 1; 

那么这给出了4计数:

var foo = {"key1": "value1", "key2": "value2", "key3": "value3"}; 
var count = 0; 
for (var k in foo) { 
    ++count; 
} 

但随着if (foo.hasOwnProperty(k))它仍然给3