多说无益,直接看效果
let obj = {
name: "Tom",
sex: "boy",
};
// Object.getOwnPropertyDescriptor() 拿到指定对象的某属性的描述对象 enumerable:true 代表可枚举
console.log(Object.getOwnPropertyDescriptor(obj, "name"));
// {value: 'Tom', writable: true, enumerable: true, configurable: true}
// Object.defineProperty() 设置对象的描述对象,将其可枚举属性值设为false
Object.defineProperty(obj, "age", {
value: "18",
enumerable: false,
});
console.log(obj); // {name: 'Tom', sex: 'boy', age: '18'}
// for in 只能遍历可枚举的属性 !!!
for (var i in obj) {
console.log(i, obj[i]);
// name Tom
// sex boy
}
// Object.keys() 返回可枚举的属性
console.log(Object.keys(obj)); // ['name', 'sex']
// Object.values() 返回可枚举属性的属性值
console.log(Object.values(obj)); // ['Tom', 'boy']
// Object.getOwnPropertyNames() 返回对象的所有属性,包含不可枚举属性
console.log(Object.getOwnPropertyNames(obj)); // ['name', 'sex', 'age']
// Reflect.ownKeys() 返回对象的所有属性,包含不可枚举属性 (这个方法比较杂,最后还有详细说明)
console.log(Reflect.ownKeys(obj)); //['name', 'sex', 'age']
// Object.entries() 是 Object.values() 与 Object.keys() 的结合
console.log(Object.entries(obj)); // [['name', 'Tom'],['sex', 'boy']]
// Object.getOwnPropertySymbols() 返回对象内的所有Symbol属性
// 在对象初始化的时候,内部是不会包含任何Symbol属性
console.log(Object.getOwnPropertySymbols(obj)); // []
let sym = Symbol();
obj[sym] = "test";
// 新建symbol,再添加到上面声明好的对象里,通过遍历得到Symbol()
console.log(Object.getOwnPropertySymbols(obj)); // [Symbol()]
// Reflect.ownKeys()返回所有属性,无论是否可枚举、symbol属性、还是继承,均会返回
console.log(Reflect.ownKeys(obj)); // ['name', 'sex', 'age', Symbol()]