前提
先定义一个对象
let obj = {a: 1, b: 2}
obj.__proto__.name = 22
obj[Symbol()] = 33
Object.defineProperty(obj, 'cc', {
value: 'cc',
enumerable: false
})
// {a: 1, b: 2, cc: "cc", Symbol(): 33} , obj.__proto__.name -> 22
各个方法
- for…in -> 遍历对象属性, 拿到可枚举的和原型上的属性, 不能拿到Symbol
for(key in obj){
console.log(key)
}
// a
// b
// name
Object.keys()
-> 返回一个由一个给定对象的自身可枚举属性组成的数组, 不会拿到原型上的属性, 拿不到Symbol
Object.keys(obj) // ["a", "b"]
Object.values()
-> 返回一个给定对象自身的所有可枚举属性值的数组, 不能拿到Symbol
Object.values(obj) //[1, 2]
Object.entries()
-> 返回一个给定对象自身可枚举属性的键值对数组, 不会拿到原型上的属性
Object.entries(obj) // [["a", 1],["b", 2]]
Object.getOwnPropertyNames()
-> 返回一个由指定对象的所有自身属性的属性名(包括不可枚举属性但不包括Symbol值作为名称的属性)组成的数组
Object.getOwnPropertyNames(obj) // ["a", "b", "cc"]
Object.getOwnPropertySymbols()
-> 返回一个给定对象自身的所有 Symbol 属性的数组
Object.getOwnPropertySymbols(obj) //[Symbol()]
Reflect.ownKeys()
-> 返回一个由目标对象自身的所有属性键组成的数组, 包括不可枚举, Symbol
Reflect.ownKeys(obj) // ["a", "b", "cc", Symbol()]