枚举是指对象中的属性是否可以遍历出来,再简单点说就是属性是否可以列举出来。
1.是否可枚举属性的影响
for…in 遍历自身的和原型上继承的可枚举属性
Object.keys 遍历自身可枚举属性
JSON.stringify的使用 字符串化自身可枚举属性
let obj = {
name: "zs",
age: 10
}
Object.defineProperty(obj, "hobby", {
value: "football",
enumerable: false
})
Object.prototype.foo = function () {
return 111
}
// 可以遍历自身以及原型链上的可枚举属性
for (const key in obj) {
console.log(key); //name age foo
}
//遍历自身的可枚举属性
const res = Object.keys(obj)
console.log(res); //["name","age"]
//遍历自身可枚举和不可枚举的属性
const result = Object.getOwnPropertyNames(obj)
console.log(result); //["name", "age", "hobby"]
2.如何判断是否可枚举
每个对象都有propertyIsEnumerable()方法,这个方法可以判断出指定的属性是否可枚举。
用法:obj.propertyIsEnumerable(“属性名”);
console.log(person.propertyIsEnumerable('name')); //true
console.log(person.propertyIsEnumerable('age'));//false
console.log(person.propertyIsEnumerable('hobby'));//false
3.总结
for…in循环是遍历自身以及原型链上面的可枚举属性;
而Object.keys只能遍历自身的可枚举属性,不可以遍历原型链上的可枚举属性,这是for…in和Object.keys()的主要区别;
Object.getOwnPropertyNames则是遍历自身所有属性(不论是否可枚举)。