js遍历对象的方法

593 阅读1分钟

(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) ]