js判断是否可以枚举

枚举是指对象中的属性是否可以遍历出来,再简单点说就是属性是否可以以列举出来。

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()则是遍历自身所有属性(不论是否是可枚举的,不包括原型链上面的。

猜你喜欢

转载自blog.csdn.net/m0_48076809/article/details/109243759