HTML: Markup language
CSS: Styling language
JavaScript: Scripting language
Web APIs: Programming interfaces
All web technology
Learn web development
Discover our tools
Get to know MDN better
Esta página foi traduzida do inglês pela comunidade. Saiba mais e junte-se à comunidade MDN Web Docs.
View in English Always switch to English
This feature is well established and works across many devices and browser versions. It’s been available across browsers since julho de 2015.
O laço for...in interage sobre propriedades enumeradas de um objeto, na ordem original de inserção. O laço pode ser executado para cada propriedade distinta do objeto.
for...in
for (variavel in objeto) {... }
variavel
Uma propriedade diferente do objeto é atribuida em cada iteração.
objeto
Objeto com as propriedades enumeradas.
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.
String
indexOf()
Object
toString()
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)
delete
Nota: 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.
Array
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.
for
Array.prototype.forEach()
for...of
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
getOwnPropertyNames()
hasOwnProperty()
propertyIsEnumerable
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"
Enable JavaScript to view this browser compatibility table.
Anterior ao SpiderMonkey 40, 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.
SyntaxError
for each in
Object.getOwnPropertyNames()
Object.prototype.hasOwnProperty()