Pergunta

O que é a diferença entre for..in e for each..in declarações em javascript? Há diferença sutil que eu não sei de ou é o mesmo e cada navegador tem um nome diferente para ele?

Foi útil?

Solução

"para cada ... em" itera uma variável especificada sobre todos os valores de propriedades do objeto especificado.

Exemplo:

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

Fonte

"for ... in" itera uma variável especificada sobre todas as propriedades de um objeto, de modo arbitrário.

Exemplo:

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

Fonte


Nota 03,2013, laços for each... in são deprecated . A sintaxe 'novo' recomendado pelo MDN é for... of .

Outras dicas

Esta demonstração espero que deve ilustrar a diferença.

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"
}

Leia documentação excelente do MDC.

O primeira é para o normal looping sobre coleções e arbitrariamente sobre as propriedades do objeto.

Um loop for ... in não iterar sobre propriedades internas. Estes incluem todos os métodos incorporados de objectos, tais como o método indexOf de corda ou método toString do objecto. No entanto, o ciclo irá interagir sobre todas as propriedades definidas pelo utilizador (incluindo qualquer que por sobreposição propriedades internas).

A for ... in itera loop sobre as propriedades de um objeto em uma ordem arbitrária. Se uma propriedade for modificado em uma iteração e, em seguida, visitou em um momento posterior, o valor exposto pelo laço será seu valor naquele tempo depois. A propriedade, que é excluído antes que ele foi visto não será então visitou mais tarde. Propriedades adicionado ao objecto sobre o qual iteração está a ocorrer tanto pode ser visitada ou omitidos de iteração. Em geral, é melhor não adicionar, modificar ou remover propriedades do objeto durante a iteração, diferente da propriedade a ser visitado; não há garantia de se ou não uma propriedade adicionada será visitado, se uma propriedade modificada será visitado antes ou depois de ser modificado ou se uma propriedade excluídos serão visitados antes de ser excluído.

O último permite varrer propriedades de um objeto.

Repete uma variável especificada sobre todos os valores de propriedades do objeto. Para cada propriedade distinta, uma declaração especificado é executado.

Além das outras respostas, tenha em mente que for each...in não é parte do padrão ECMA e também não está incluído no próxima edição 3.1 . Foi introduzido no JavaScript 1.6, que é um href="http://en.wikipedia.org/wiki/JavaScript#Versions" rel="nofollow noreferrer"> extensão pela Fundação Mozilla.

De acordo com a página da Wikipedia ligado, é apenas implementada no Firefox 1.5+ e Safari 3.x (+?).

scroll top