同样可以遍历对象的属性,Obejct.keys()和for...in有什么区别

127 阅读1分钟

Object.keys()

Object.keys() 方法会返回一个由一个给定对象的自身可枚举属性组成的数组,数组中属性名的排列顺序和使用 for...in 循环遍历该对象时返回的顺序一致 。

const personA = {
    nameA:'kobe',
    nameB:'bryant'
};
Object.keys(personA)  => ['nameA','nameB']

for...in

for...in不仅可以迭代一个对象的自身可枚举属性还可以迭代原型链中的属性。

const personA = {
    nameA:'kobe',
    nameB:'bryant'
};
const personB = {
    namec: 'curry'
};
Object.setPrototypeOf(personB,personA);
//Object.setPrototypeOf() 方法设置一个指定的对象的原型到另一个对象或 null。
​
personB['nameC'];  => 'curry';
​
for(let key in personB){
    console.log(key);      
}
// 'nameA'
// 'nameB'
// 'nameC'

所以,以上两者的区别在于是否可以迭代原型链中的属性。

仅迭代自身的属性

如果你只要考虑对象本身的属性,而不是它的原型,那么使用 getOwnPropertyNames() 或执行 hasOwnProperty() 来确定某属性是否是对象本身的属性。

for(let key in personB){
    if (obj.hasOwnProperty(key)) {
        console.log(key);
    }     
}
// 'nameA'
// 'nameB'