【发布时间】:2012-11-21 05:15:27
【问题描述】:
我正在制作一个类似 jQuery 的小型库,让我感到奇怪的是$.each 的行为。
在 javascript 中,我们有一个 for...in 循环:
for (var key in obj) {
console.log(key + ': ' + obj[key]);
}
这样做的问题在于,它还将迭代继承属性,即来自对象构造函数原型的属性。
例如,使用hasOwnProperty 可以知道这一点。而jQuery 可以做到这一点。
但是,当您将一个对象传递给$.each 时,它的行为完全 就像for...in 一样,也会迭代继承的属性。它也应该稍微慢一些,并且需要输入更多字符。
查看this fiddle 以查看它的实际效果,查看look here 以获取$.each 的源代码。
所以我的问题是,jQuery 中是否有一个 object 迭代方法只包含自己的属性?如果不是,图书馆应该像这样吗?
编辑: 由于 jQuery 不这样做,你也可以回答如果这有用。我的意思是,我看不到自己想要迭代原型属性,但也许我错过了一些东西。
【问题讨论】:
-
找到它的唯一方法是使用
hasOwnProperty。 jsfiddle.net/mpTkA/2 -
在较新的浏览器中还有
Object.keys()。 -
@Pointy,很高兴知道)
getOwnPropertyNames可能会更好 -
快速说明: 确保如果您使用本机
for-in,则将var用于key:for (var key in obj)。否则你会得到一个意外的全局。 (除非您真的希望key是全局性的,在这种情况下,您可能应该找到一种更好的方法来做您想做的任何事情。)其他快速说明: 使用hasOwnProperty时,保存引用而不是通过点表示法调用它可能会更安全一些:var has = Object.prototype.hasOwnProperty; has.call({abc: 'xyz'}, 'abc');.
标签: javascript jquery iteration for-in-loop hasownproperty