потому что я из foo возвращает дополнительные ключи? - PullRequest
4 голосов
/ 16 августа 2011

Я вызываю это для массива с 3 объектами. В итоге возвращаются правильные ключи в дополнение к этим дополнительным ключам ... unique last truncate random include contains any

Почему?

Ответы [ 2 ]

6 голосов
/ 16 августа 2011

Вы получаете эти дополнительные свойства, потому что вы или используемая вами библиотека расширили прототип Array. Как указывает Майк в своем ответе, вы можете пропустить их, используя hasOwnProperty. Действительно, в CoffeeScript встроено ключевое слово own, которое делает это за вас:

for own i of foo
  obj = foo[i]
  ...

Но, как Майк также указывает в своем ответе, более эффективно обходить массив, увеличивая счетчик, а не перебирая ключи. Для этого вы должны использовать синтаксис for...in CoffeeScript:

for obj in foo
  ...

(Если вам нужны также индексы в цикле, вы можете написать for obj, i in foo.)

3 голосов
/ 16 августа 2011

for (... in ...) вернет вещи по прототипу объекта.См. JavaScript для ... в vs для

. Лучшее решение - перебирать элементы массива, используя цикл индекса

for (var i = 0, n = arr.length; i < n; ++i) { ... }

.цифровой ключ вместо строки и надежная итерация по порядку.

В качестве альтернативы вы можете использовать hasOwnProperty, чтобы убедиться, что вы не получите ключи от прототипа.

for (var k in obj) {
  if (!obj.hasOwnProperty(k)) { continue; }
  ...
}

или вариант, если вас беспокоит переопределение hasOwnProperty.

Еще более альтернативно, вы можете определить эти свойства прототипа как enumerable: false, используя Object.defineProperty.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...