因为我的foo正在返回额外的钥匙?

时间:2011-08-16 19:17:14

标签: node.js coffeescript

我在一个包含3个对象的数组中调用它。除了这些额外的键之外,它最终会返回正确的键... unique last truncate random include contains any

为什么?

2 个答案:

答案 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