В чем разница между for..in и for each..in в javascript?

в чем разница между инструкциями for..in и for each..in в javascript? Есть тонкое различие, что я не знаю или это то же самое, и каждый браузер имеет другое название?

4 ответов


"для каждого...в" перебирай указанной переменной над все значения свойства указанного объекта.

пример:

var sum = 0;
var obj = {prop1: 5, prop2: 13, prop3: 8};
for each (var item in obj) {
  sum += item;
}
print(sum); // prints "26", which is 5+13+8

источник

"Для...в" перебирай указанной переменной над все свойства объекта, в произвольном порядке.

пример:

function show_props(obj, objName) {
   var result = "";
   for (var i in obj) {
      result += objName + "." + i + " = " + obj[i] + "\n";
   }
   return result;
}

источник


Примечание 03.2013, for each... in петли are устаревший. "Новый" синтаксис, рекомендованный MDN, -for... of.


эта демонстрация, надеюсь, проиллюстрирует разницу.

var myObj = {
    a : 'A',
    b : 'B',
    c : 'C'
};
for each (x in myObj) {
    alert(x);        // "A", "B", "C"
}
for (x in myObj) {
    alert(x);        // "a", "b", "c"
    alert(myObj[x]); // "A", "B", "C"
}

прочитайте отличную документацию MDC.

на первый для нормального цикла над коллекциями и произвольно над свойствами объекта.

цикл for...in не выполняет итерацию по встроенным свойствам. К ним относятся все встроенные методы объектов, такие как метод indexOf String или метод toString объекта. Однако цикл будет повторять все пользовательские свойства (включая те, которые перезаписывают встроенные свойства).

A for...in цикл перебирает свойства объекта в произвольном порядке. Если свойство изменяется за одну итерацию, а затем посещается в более позднее время, значение, предоставляемое циклом, будет его значением в это более позднее время. Свойство, удаленное до его посещения, не будет посещено позднее. Свойства, добавленные к объекту, над которым выполняется итерация, могут быть посещены или опущены из итерации. В общем случае лучше не добавлять, не изменять и не удалять свойства из объекта во время итерации, кроме свойства, которое в данный момент посещается; нет никакой гарантии, будет ли посещено добавленное свойство, будет ли посещено измененное свойство до или после его изменения, или будет ли посещено удаленное свойство до его удаления.

на последний позволяет перебирать свойства объекта.

выполняет итерацию указанной переменной по всем значениям объекта свойства. Для каждого отдельного свойства выполняется указанный оператор.


в дополнение к другим ответам, имейте в виду, что for each...in не является частью стандарта ECMA, а также не входит в предстоящее издание 3.1. Он был представлен в JavaScript 1.6, который является