因为我的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