for...in
循环是遍历对象的每一个可枚举属性,包括原型链上面的可枚举属性。
Object.keys()
只是遍历自身的可枚举属性,不包括遍历原型链上的可枚举属性. 这是for...in
和Object.keys()
的主要区别。
Object.getOwnPropertyNames()
则是遍历自身所有属性(不论是否是可枚举的),不包括原型链上面的。
function People(){
this.name = 'Tom';
this.age = 24;
this.c = function(){
console.log('1');
}
}
People.prototype.look = function(){
console.log('look at this');
}
var b = new People();
//使用Object.defineProperty方法为b添加一个'sex'的不可枚举属性
Object.defineProperty(b,'sex',{
value:'女',
enumerable:false
});
for(var i in b){
console.log(i); //结果["name","age","c","look"]
}
console.log(Object.keys(b));//结果["name","age","c"]
console.log(Object.getOwnPropertyNames(b));//结果["name", "age", "c", "sex"]