1.对象的可枚举性
// Object.getOwnPropertyDescriptor方法可以获取该属性的描述对象。
let obj = { foo: 123 };
Object.getOwnPropertyDescriptor(obj, 'foo')
// {
// value: 123,
// writable: true,
// enumerable: true, //描述对象的enumerable属性,称为“可枚举性”,如果该属性为false,就表示某些操作会忽略当前属性。
// configurable: true
// }
目前,有四个操作会忽略enumerable为false的属性。
for...in循环:只遍历对象自身的和继承的可枚举的属性。
Object.keys():返回对象自身的所有可枚举的属性的键名。
JSON.stringify():只串行化对象自身的可枚举的属性。
Object.assign(): 忽略enumerable为false的属性,只拷贝对象自身的可枚举的属性。
2、属性的遍历
let obj = {
name: 'tangCandy',
age: 18,
sex: 2,
skill() {
return 'eat'
},
__proto__: {
lastname: '唐' //在对象原型上加属性
}
}
for...in 循环遍历对象自身的和继承的可枚举属性(不含 Symbol 属性)
for (var key in obj) {
console.log(key, ":", obj[key]); //自己加的原型上的属性也会一起被遍历进来
//可以判断是否是自己的属性
if (obj.hasOwnProperty(key)) {
console.log(key, ":", obj[key]);
}
}
Object.keys(obj) 返回一个数组,包括对象自身的(不含继承的)所有可枚举属性(不含 Symbol 属性)的键名。
let keyarr = Object.keys(obj); //['name', 'age', 'sex', 'skill']
keyarr.forEach(function (key) {
console.log(key, ":", obj[key]);
});
Object.getOwnPropertyNames(obj) 返回一个数组,包含对象自身的所有属性(不含 Symbol 属性,但是包括不可枚举属性)的键名。
Object.keys(obj).forEach(function (key) {
console.log(key, ":", obj[key]);
});
Object.getOwnPropertySymbols(obj) 返回一个数组,包含对象自身的所有 Symbol 属性的键名。
Object.getOwnPropertyNames(obj).forEach(function (key) {
console.log(key, ":", obj[key]);
});
Reflect.ownKeys(obj) 返回一个数组,包含对象自身的(不含继承的)所有键名,不管键名是 Symbol 或字符串,也不管是否可枚举
Reflect.ownKeys(obj).forEach(function (key) {
console.log(key, ":", obj[key]);
});