MDN wants to learn about developers like you: https://qsurvey.mozilla.com/s3/MDN-dev-survey

O laço for...in  interage sobre propriedades enumeradas de um objeto. Para aqueles que conhecem o laço de repetição for(var i=0; i < 10; i++) ele é semelhante, porém, com particularidades e mais simplicidade na utilização. Se você ainda não conhece o laço for é aconselhável estudá-lo antes.

Syntax

for (variavel in objeto) {...
}
variavel
Uma propriedade diferente do objeto é atribuida em cada iteração.
objeto
Objeto com as propriedades enumeradas.

Descrição

O laço for...in somente iterage sobre propriedades enumeradas. Objetos criados a partir de construtores built-in (arrays e object) herdam propriedades não enumeradas de object.prototype e String.prototype, assim como método String's indexOf() ou Object's toString(). O laço irá iterar sobre todas as propriedades enumeráveis do próprio objeto e somente aquelas enumeráveis herdadas de construtores de objetos prototype.

Propriedades deletadas, adicionadas ou modificadas

O laço for...in iterage sobre as propriedades de um objeto em uma ordem arbitrária (veja o delete ). Se uma propriedade é deletada durante a execução do loop, ela se torna indisponível para ser acessada depois. É recomendável não adicionar, remover ou alterar propriedades novas ao objeto durante a execução do laço (durante o loop)

Iteração em Arrays e for...in

Note: for...in não deve ser usado para iteração em uma Array onde a ordem é importante, visto que ele iterage em uma ordem arbitrária.

Indices de arrays somente se tornam propriedades enumeradas com inteiros (integer). Não há garantia de que utilizando o laço for...in os indices de um array serão retornados em uma ordem particular ou irá retornar todas as propriedades enumeráveis. É recomendável utilizar o laço for com índices numéricos ou Array.prototype.forEach() ou ainda for...of quando iteragir sobre arrays onde a ordem é importante.

Iteração apenas sobre suas próprias propriedades

Se você quer considerar somente as propriedades do próprio objeto e não as herdadas via prototype, use getOwnPropertyNames() ou execute hasOwnProperty()  ou (propertyIsEnumerable

Exemplos

A função seguinte toma como argumento um objeto. O laço for...in iterage sobre todos as propriedades enumeráveis do objeto e retorna uma string com o nome das propriedades e seus respectivos valores.

//Objeto
var obj = {a:1, b:2, c:3};

//Para prop (propriedade) in obj (objeto) faça
for (var prop in obj) {
  // ctrl+shift+k (para abrir o console no mozilla firefox)
  console.log("obj." + prop + " = " + obj[prop]);
}

//A saída (output) deverá ser:
// "obj.a = 1"
// "obj.b = 2"
// "obj.c = 3"

A função seguinte ilustra o uso de hasOwnProperty(): as propriedades herdadas não são exibidas.

var triangle = {a:1, b:2, c:3};

function ColoredTriangle() {
  this.color = "red";
}

ColoredTriangle.prototype = triangle;

var obj = new ColoredTriangle();

for (var prop in obj) {
  if( obj.hasOwnProperty( prop ) ) {
    console.log("obj." + prop + " = " + obj[prop]);
  } 
}

// Output:
// "obj.color = red"

Specificações

Specificação Status Comentário
ECMAScript 2017 Draft (ECMA-262)
The definition of 'for...in statement' in that specification.
Draft  
ECMAScript 2015 (6th Edition, ECMA-262)
The definition of 'for...in statement' in that specification.
Standard  
ECMAScript 5.1 (ECMA-262)
The definition of 'for...in statement' in that specification.
Standard  
ECMAScript 3rd Edition (ECMA-262)
The definition of 'for...in statement' in that specification.
Standard  
ECMAScript 1st Edition (ECMA-262)
The definition of 'for...in statement' in that specification.
Standard Definição inicial

Compatibilidade de Browsers

Característica Chrome Firefox (Gecko) Internet Explorer Opera Safari
Suporte básico (Yes) (Yes) (Yes) (Yes) (Yes)
Feature Android Chrome for Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
Basic support (Yes) (Yes) (Yes) (Yes) (Yes) (Yes)

Compatibilidade: Initializer expressions

Anterior ao SpiderMonkey 40 (Firefox 40 / Thunderbird 40 / SeaMonkey 2.37), era possível usar uma expressão inicial com o laço for...in, conforme exemplo que se segue:

var obj = {a:1, b:2, c:3};
for(var i=0 in obj) {
  console.log(obj[i]);
}
// 1
// 2
// 3

Este não é o comportamento padrão e atualmente é ignorado a partir da versão 40 e posteriores e seu uso irá exibir o error SyntaxError ("for-in loop head declarations may not have initializers"). Outras engines como a v8 (Chrome), Chakra (IE/Edge) e JSC (Webkit/Safari) estão estudando o que fazer com esse comportamento.

Veja também

Etiquetas do documento e colaboradores

 Colaboradores desta página: samir.araujo, Gutemberg
 Última atualização por: samir.araujo,