“for...in é aquele colega de equipe que fala até com o café da recepção. Já o Object.entries() só responde se for marcado no Slack.”
🤯 A treta da vez
Tava eu, revisando um código alheio e vi isso aqui abaixo:
// Student herdando o atributo name de person
const person = { name: 'Werliton Silva' };
const student = Object.create(person);
student.id = 12;
student.age = 25;
Em um trecho seguinte, houve a necessidade de listar todas as propriedades do objeto a partir de um loop, como segue:
// Student herdando o atributo name de person
const person = { name: 'Werliton Silva' };
const student = Object.create(person);
student.id = 12;
student.age = 25;
for (let [key, value] of Object.entries(student)) {
console.log(key, value);
}
// resultado do console.log
// id 12
// age 25
A pessoa usou Object.entries(student) esperando que o name aparecesse.
E eu só pensei:
“Irmão, você caiu no bait do JavaScript clássico.”
🚫 Por que o name não aparece?
Porque Object.entries() (assim como Object.keys() e Object.values()) só retorna as propriedades PRÓPRIAS do objeto.
Se o valor veio do protótipo (ou herdado), ele é ignorado com gosto.
É tipo aquele parente distante que você só lembra no Natal. Tá lá, faz parte da família, mas você não chama pro churrasco do domingo.
✅ Quem traz tudo, até o que você não pediu?
O bom e velho for...in.
for (let key in student) {
console.log(key, student[key]);
}
// resultado do console.log
// id 12
// age 55
// name Werliton Silva
Esse é fofoqueiro.
Vai puxar id, age e o name herdado da cadeia de protótipos.
Tem seu valor — só cuidado pra não trazer coisas demais pro seu loop.
🕵️ E se eu quiser saber de onde vem cada propriedade?
Use o lendário hasOwnProperty():
for (let key in student) {
const origem = student.hasOwnProperty(key) ? 'própria' : 'herdada';
console.log(`${key}: ${student[key]} (${origem})`);
}
// resultado do console.log
// id 12 (própria)
// age 55 (própria)
// name Werliton Silva (herdada)
Aí sim você vira o Sherlock Holmes da prototipagem. Dá até pra montar um console.table() bonito e jogar num log que vai parar em produção. (Brincadeira. Ou não.)
Conclusão
Se você está usando Object.entries() achando que vai listar tudo , tá igual eu achando que sei cozinhar só porque faço miojo com ovo.
Conheça suas ferramentas.
E mais importante: entenda como funciona a herança no JavaScript.
Ela é linda, poderosa, e traiçoeira como um bug na sexta-feira às 17h.
🚀 Werliton Silva
Especialista Frontend | Caçador de Bugs | Evangelizador do hasOwnProperty() desde 2012