因为我的foo是返回额外的密钥?
我打电话给一个有3个对象的数组。 除了这些额外的键,它最终返回正确的键… unique last truncate random include contains any
为什么?
您正在获得这些额外的属性,因为您或者您正在使用的库已经扩展了Array
原型。 正如Mike在他的回答中指出的,你可以通过使用hasOwnProperty
来跳过这些。 事实上,CoffeeScript有一个own
关键字,为你做这个:
for own i of foo obj = foo[i] ...
但是,正如Mike在他的回答中指出的那样,通过递增计数器来循环访问数组的效率更高,而不是迭代键。 要做到这一点,你可以使用CoffeeScript for...in
语法:
for obj in foo ...
(如果你在循环中也需要索引,你可以写for obj, i in foo
。)
for (... in ...)
将返回对象原型上的东西。 查看JavaScript for … in和vs for
最好的解决scheme是使用索引循环遍历数组元素
for (var i = 0, n = arr.length; i < n; ++i) { ... }
这有一个数字键,而不是一个string,并依次可靠迭代的好处。
或者,您可以使用hasOwnProperty
来确保您不从原型获取密钥。
for (var k in obj) { if (!obj.hasOwnProperty(k)) { continue; } ... }
或者如果你担心hasOwnProperty
被覆盖,那么就是一个变种。
更有甚者,你可以使用Object.defineProperty
将这些原型属性定义为enumerable: false
。