Fui direcionado para as MDN's da página for..in quando dizia "for..in" itera sobre as propriedades enumeráveis de um objeto ".
Depois fui para a página Enumerabilidade e propriedade das propriedades, onde dizia "Propriedades enumeráveis são aquelas que podem ser iteradas por um loop for..in".
O dicionário define enumerável como contável, mas não consigo realmente visualizar o que isso significa. Eu poderia obter um exemplo de algo sendo enumerável?
javascript
enumerable
Patrick
fonte
fonte
for-in
faz?for in
loop ou não (para aqueles que não querem saber os detalhes ou simplesmente não se importam;))Respostas:
Uma propriedade enumerável é aquela que pode ser incluída e visitada durante
for..in
loops (ou uma iteração semelhante de propriedades, comoObject.keys()
).Se uma propriedade não for identificada como enumerável, o loop ignorará que está dentro do objeto.
Uma propriedade é identificada como enumerável ou não por seu próprio
[[Enumerable]]
atributo . Você pode visualizar isso como parte do descritor da propriedade :Um
for..in
loop itera pelos nomes das propriedades do objeto.Mas, apenas avalia sua declaração -
console.log(prop);
nesse caso - para aquelas propriedades cujo[[Enumerable]]
atributo étrue
.Essa condição está em vigor porque os objetos têm muito mais propriedades , especialmente de herança :
Cada uma dessas propriedades ainda existe no objeto :
Mas, eles são ignorados pelo
for..in
loop porque não são enumeráveis.fonte
But, they are skipped (or not counted) by the for..in loop because they are not enumerable
. As propriedades onObject.prototype
são de fato ignoradas porque estão mais acima na cadeia de protótipos, não porque não são enumeráveis. Nem mostregetOwnPropertyNames()
nemkeys()
propriedades que não sejam de um objeto. Como uma observação lateral, é verdade que muitas das propriedades internas não são enumeráveis e, portanto, não serão exibidaskeys()
, mas você precisará escrever um código extra se desejar percorrer a cadeia de protótipos.Se você criar um objeto via
myObj = {foo: 'bar'}
ou algo a seguir, todas as propriedades serão enumeráveis. Portanto, a pergunta mais fácil a ser feita é: o que não é enumerável? Certos objetos têm algumas propriedades não enumeráveis, por exemplo, se você chamarObject.getOwnPropertyNames([])
(que retorna uma matriz de todas as propriedades, enumeráveis ou não, em []), ele retornará['length']
, o que inclui a propriedade não enumerável de uma matriz, 'length' .Você pode criar suas próprias propriedades não enumeráveis chamando
Object.defineProperty
:Este exemplo empresta muito de propriedades Não enumeráveis em JavaScript , mas mostra um objeto sendo enumerado. As propriedades podem ser ou não graváveis, configuráveis ou enumeráveis. John Resig discute isso no escopo do ECMAScript 5 Objects and Properties .
E há uma pergunta de estouro de pilha sobre por que você desejaria tornar as propriedades não enumeráveis .
fonte
É muito mais chato do que algo que deve ser visualizado.
Existe literalmente um atributo em todas as propriedades chamadas "enumeráveis". Quando definido como false, o
for..in
método pula essa propriedade e finge que não existe.Existem muitas propriedades em objetos que têm "enumerável" definido como false, como "valueOf" e "hasOwnProperty", porque presume-se que você não queira que o mecanismo JavaScript itere sobre eles.
Você pode criar suas próprias propriedades não enumeráveis usando o
Object.defineProperty
método:Agora, o fato de haver um segredo sobre o carro está oculto. É claro que eles ainda podem acessar a propriedade diretamente e obter a resposta:
Mas, eles precisariam saber que a propriedade existe primeiro, porque se eles estiverem tentando acessá-la
for..in
ouObject.keys
permanecerão completamente secretos:Eles deveriam ter chamado de "forInAble".
fonte
Se você está tendo dificuldades para visualizar "o que significa ser enumerável?" por que não perguntar a si mesmo, o que significa ser inumerável ?
Penso um pouco assim: existe uma propriedade inumerável, mas está parcialmente oculta ; significando que não numerável é o estranho. Agora você pode imaginar enumerável como o que resta - a propriedade mais natural que estamos acostumados a encontrar desde que descobrimos Objetos . Considerar
Agora em um
for..in
, imagine como pseudocódigoonde o corpo do loop digitado em JavaScript está no lugar de
/* whatever */
fonte
Vou escrever uma definição de linha de ENUMERABLE
Enumerable
: Especifica se a propriedade pode ser retornada em um loop for / in.fonte
métodos não são enumeráveis; ou melhor, métodos embutidos não são .. depois de pesquisar o que significa numeroso para script java; apenas se refere a um atributo de propriedade .. todos os objetos criados em ecma3 são enumeráveis, e ecma5 agora pode defini-lo .... é isso ..: D lol, demorei um pouco para encontrar a resposta; mas acredito que isso seja discutido no livro de David Flanagan. Acho que significa "oculto" ou não "oculto", pois os métodos não são mostrados no loop for in e, portanto, são "ocultos"
fonte
Pense no tipo de dados enum, apenas uma estrutura de objetos que correspondem a números diferentes. Declarar algo como um enumerável é declarar que corresponde a um número específico, permitindo que seja atribuído um lugar em um Dicionário que represente componentes contáveis de um objeto. Simplificando, tornar um objeto enumerável é o mesmo que dizer ao compilador: "Ei, essa propriedade conta, eu quero ver isso quando procurar dados sobre esse objeto".
fonte
Os métodos internos herdados pelos objetos não são enumeráveis, mas as propriedades que seu código adiciona aos objetos são enumeráveis, a menos que seja declarado explicitamente
fonte