可枚举性(enumerable)用来控制所描述的属性,是否将被包括在for…in循环之中。具体来说,如果一个属性的enumerable为false,下面三个操作不会取到该属性。
* for..in循环
* Object.keys方法
* JSON.stringify方法
// 为 Object 设置三个自定义属性(可枚举)
Object.prototype.userProp = 'userProp';
Object.prototype.getUserProp = function() {
return Object.prototype.userProp;
};
// 定义一个对象,隐式地继承自 Object.prototype
var obj = {
name: 'percy',
age: 21,
[Symbol('symbol 属性')]: 'symbolProp',
unEnumerable: '我是一个不可枚举属性',
skills: ['html', 'css', 'js'],
getSkills: function() {
return this.skills;
}
};
// 设置 unEnumerable 属性为不可枚举属性
Object.defineProperty(obj, 'unEnumerable', {
enumerable: false
});
ES6 之后,共有以下 5 种方法可以遍历对象的属性。
- for…in: 遍历对象自身的和继承的可枚举属性(不含 Symbol 类型的属性)
for (let key in obj) {
console.log(key);
console.log(obj.key); // wrong style
console.log(obj[key]); // right style
}
//["name", "age", "skills", "getSkills", "userProp ", "getUserProp "]
- Object.keys(obj):返回一个数组,包括对象自身的(不含继承的)所有可枚举属性(不含 Symbol 类型的属性)
Object.keys(obj);
// ["name", "age", "skills", "getSkills"]
- Object.getOwnPropertyNames(obj):返回一个数组,包含对象自身的所有属性(不含 Symbol 类型的属性,不包含继承属性,但是包括不可枚举属性)
Object.getOwnPropertyNames(obj);
// ["name", "age", "unEnumerable", "skills", "getSkills"]
- Object.getOwnPropertySymbols(obj):返回一个数组,包含对象自身的所有 Symbol 类型的属性(不包括继承的属性)
Object.getOwnPropertySymbols(obj);
// [Symbol(symbol 属性)]
- Reflect.ownKeys(obj):返回一个数组,包含对象自身的所有属性(包含 Symbol 类型的属性,还有不可枚举的属性,但是不包括继承的属性)
Reflect.ownKeys(obj);
// ["name", "age", "unEnumerable", "skills", "getSkills", Symbol(symbol 属性)]