(1)for...in
for...in循环遍历对象自身的和继承(原型链上)的可枚举属性(不含 Symbol 属性)的键名。
(2-1)Object.keys(obj)
Object.keys返回一个数组,包括对象自身的所有可枚举属性(不含 Symbol 属性)的键名。
(2-2)Object.values(obj)
Object.keys返回一个数组,包括对象自身的所有可枚举属性(不含 Symbol 属性)的键值。
(3)Object.getOwnPropertyNames(obj)
Object.getOwnPropertyNames返回一个数组,包含对象自身的所有属性(不含 Symbol 属性,但是包括不可枚举属性)的键名。
(4)Object.getOwnPropertySymbols(obj)
Object.getOwnPropertySymbols返回一个数组,包含对象自身的所有 Symbol 属性的键名。
(5)Reflect.ownKeys(obj)
Reflect.ownKeys返回一个数组,包含对象自身的所有键名,不管键名是 Symbol 或字符串,也不管是否可枚举。
总结一下
| 自身可枚举属性 | 自身不可枚举属性 | 自身Symbol属性 | 原型链可枚举属性 | |
|---|---|---|---|---|
| for...in | ✅ | ✅ | ||
| Object.keys/values(obj) | ✅ | |||
| Object.getOwnPropertyNames(obj) | ✅ | ✅ | ||
| Object.getOwnPropertySymbols(obj) | ✅ | |||
| Reflect.ownKeys(obj) | ✅ | ✅ | ✅ |
直接上🌰
Object.prototype.method = function () {
console.log(this.length);
}
var d = Symbol("d")
var myObject = {
a:1,
b:2,
c:3,
[d]:4,
'e':5
}
myObject.name = "我的对象"
Object.defineProperty(myObject,'f',{
value:6,
configurable: true,
enumerable: true
})
Object.defineProperty(myObject,'g',{
value:7,
configurable: true,
enumerable: false
})
(1)for...in
for (var index in myObject) {
console.log(index);
}
//a b c e name f method
(2-1)Object.keys(obj)
console.log(Object.keys(myObject))
//[ 'a', 'b', 'c', 'e', 'name', 'f' ]
(2-2)Object.values(obj)
console.log(Object.values(myObject))
//[ 1, 2, 3, 5, '我的对象', 6 ]
(3)Object.getOwnPropertyNames(obj)
console.log(Object.getOwnPropertyNames(myObject))
//[ 'a', 'b', 'c', 'e', 'name', 'f', 'g' ]
(4)Object.getOwnPropertySymbols(obj)
console.log(Object.getOwnPropertySymbols(myObject))
//[ Symbol(d) ]
(5)Reflect.ownKeys(obj)
console.log(Reflect.ownKeys(myObject))
//[ 'a', 'b', 'c', 'e', 'name', 'f', 'g', Symbol(d) ]