我在一个包含3个对象的数组中调用它。除了这些额外的键之外,它最终会返回正确的键...
unique
last
truncate
random
include
contains
any
为什么?
答案 0 :(得分:6)
您正在获得这些额外的属性,因为您或您正在使用的库已扩展了Array
原型。正如迈克在答案中指出的那样,你可以使用hasOwnProperty
跳过这些。实际上,CoffeeScript内置了own
关键字,可以为您完成此任务:
for own i of foo
obj = foo[i]
...
但是,正如Mike在他的回答中指出的那样,通过递增计数器而不是遍历键来循环数组更有效。为此,您将使用CoffeeScript的for...in
语法:
for obj in foo
...
(如果你也需要循环中的索引,你可以写for obj, i in foo
。)
答案 1 :(得分:3)
for (... in ...)
将返回对象原型上的内容。见JavaScript for...in vs for
最好的解决方案是使用索引循环迭代数组元素
for (var i = 0, n = arr.length; i < n; ++i) { ... }
这样做的好处是可以获取数字键而不是字符串,并按顺序可靠地迭代。
或者,您可以使用hasOwnProperty
确保不从原型中获取密钥。
for (var k in obj) {
if (!obj.hasOwnProperty(k)) { continue; }
...
}
或者如果您担心被hasOwnProperty
被覆盖,则会有所变化。
更可替代地,您可以使用Object.defineProperty
将这些原型属性定义为enumerable: false
。