枚举是指对象中的属性是否可以遍历出来,再简单点说就是属性是否可以以列举出来。
1.是否可枚举属性的影响
for…in 遍历自身的和原型上继承的可枚举属性
Object.keys 遍历自身可枚举属性
JSON.stringify的使用 字符串化自身可枚举属性
function Person() {
this.name = "小明"
};
Person.prototype = {
hobby: "打球",
};
var person = new Person();
Object.defineProperty(person, "age", {
value: 18,
enumerable: false
});
// for...in,遍历自身的和原型上继承的可枚举属性
for(var keys in person){
console.log(keys); // name,hobby
}
// Object.keys,遍历自身可枚举属性
console.log(Object.keys(person)); //["name"]
// JSON.stringify,字符串自身可枚举属性
console.log(JSON.stringify(person)); //{"name":"小明"}
console.log(Object.assign({
},person)); //{name: "小明"}
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()则是遍历自身所有属性(不论是否是可枚举的,不包括原型链上面的。