系列链接:
可枚举性(enumerable)
通过赋值操作添加的普通属性是可枚举的,在枚举对象属性时会被枚举到(for...in
或 Object.keys
等方法)。
在Object.defineProperty()
方法中 enumerable 键值默认为 false,
当且仅当该属性的 enumerable 键值为 true 时,该属性才会出现在对象的枚举属性中。
const obj = {
name: 'lsc',
age: 21
}
// defineProperty添加属性默认不可枚举
// Object.defineProperty(obj, 'height', {
// value: 187
// })
// console.log(Object.entries(obj)); // [ [ 'name', 'lsc' ], [ 'age', 21 ] ]
Object.defineProperty(obj, 'height', {
enumerable: true, // 可枚举
value: 187
})
console.log(Object.entries(obj)); // [ [ 'name', 'lsc' ], [ 'age', 21 ], [ 'height', 187 ] ]
复制代码
propertyIsEnumerable判断是否可枚举
每个对象都有一个propertyIsEnumerable
方法。此方法可以确定对象中指定的属性是否可以被 for...in
循环枚举,但是通过原型链继承的属性除外。
let arr = [1,2,3]
console.log(arr.propertyIsEnumerable(0)); // true
console.log(arr.propertyIsEnumerable('length')); // false
// js的内置方法和属性几乎都不可枚举
复制代码
Symbol
Symbol 作为属性名,遍历对象的时候,该属性不会出现在for...in
、for...of
循环中,也不会被Object.keys()
、Object.getOwnPropertyNames()
、JSON.stringify()
返回。
// 写法1
let obj = {};
obj[s1] = "aaa";
console.log(obj); // { [Symbol(s)]: 'sss' }
// 写法2
let obj2 = {
[s2]: "bbb"
};
console.log(obj2);
// 写法3
let obj3 = {};
Object.defineProperty(obj3, s3, {
value: "ccc",
enumerable: true
});
console.log(obj3); // { [Symbol(s333)]: 'ccc' }
复制代码
遍历方法介绍
1. Object.getOwnPropertyNames()
Object.getOwnPropertyNames()
方法返回一个由指定对象的所有自身属性的属性名(包括不可枚举属性但不包括Symbol值作为名称的属性)组成的数组。.
特点:可获取所有自身属性,包括不可枚举属性
// 这里只验证可获得不可枚举属性
const obj = {
name: 'lsc',
age: 21
}
// defineProperty添加属性默认不可枚举
Object.defineProperty(obj, 'height', {
value: 187
})
console.log(Object.getOwnPropertyNames(obj)); // [ 'name', 'age', 'height' ]
复制代码
2. Object.getOwnPropertySymbols()
在给定对象自身上找到的所有 Symbol 属性的数组
特点:可获取自身所有Symbol属性,包括不可枚举的Symbol属性
let s1 = Symbol('sss111')
let s2 = Symbol('sss222')
const obj = {
name: 'lsc',
[s1]: '我是s1'
}
Object.defineProperty(obj, s2, {
value: '我是s2' // s2为不可枚举的symbol属性
})
console.log(Object.getOwnPropertySymbols(obj)); // [ Symbol(sss111), Symbol(sss222) ]
console.log(obj[s2]); // 我是s2
复制代码
3.Reflect.ownKeys()
Reflect.ownKeys()
方法返回一个由目标对象自身的属性键组成的数组。它的返回值相等于Object.getOwnPropertyNames(target).concat(Object.getOwnPropertySymbols(target))
特点:可获取所有自身属性,包括不可枚举属性和Symbol属性
const obj = {
name: 'lsc',
age: 21
}
// defineProperty添加属性默认不可枚举的普通属性
Object.defineProperty(obj, 'height', {
value: 187
})
// defineProperty添加属性默认不可枚举的Symbol属性
let weight = Symbol('weight')
Object.defineProperty(obj, weight, {
value: 170
})
console.log(Reflect.ownKeys(obj)); // [ 'name', 'age', 'height', Symbol(weight) ]
复制代码
但是三个方法都无法获取原型链属性
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END