遍历对象的方法有3种:Object.keys,for...in,Object.getOwnPropertyNames(),下面就来分别说一下他们的用法。
1、Object.keys(Object)
let obj = {a:1,b:2,c:3}
let keys = Object.keys(obj);
for(let i = 0; i < keys.length; i++){
let key = keys[i];
let value = obj[key];
console.log('key',key,'value',value)
}
//打印如下:
//key a value 1
//key b value 2
//key c value 3
2、for(let item in Object)
let obj = {a:1,b:2,c:3}
for(let key in obj){
console.log('key',key,'value',obj[key])
}
//打印如下
//key a value 1
//key b value 2
//key c value 3
3、Object.getOwnPropertyNames(Object)
let obj = {a:1,b:2,c:3}
let keys = Object.getOwnPropertyNames(obj)
for(let i = 0; i < keys.length; i++){
let key = keys[i];
let value = obj[key];
console.log('keys',key,'value',value)
}
//打印如下
//keys a value 1
//keys b value 2
//keys c value 3
从上面三个例子来看,打印的内容没有什么区别,是因为 obj 的创建采用了字面量的方式,这样对象中的每个属性都是可枚举的,如果采用Object.create()来分别创建几个可枚举、不可枚举的属性,就会发现它们的区别:
let obj = Object.create(parent,{
a:{"value":1,"writable":true,"enumerable":true,"configurable":true},
b:{"value":1,"writable":true,"enumerable":true,"configurable":true},
c:{"value":1,"writable":true,"enumerable":false,"configurable":true}
})
obj.__proto__ = {"age":18}
1) Object.keys(obj),无法打印设置为 不可枚举的 属性,无法打印原型上的属性 age;
2)for...in,无法打印设置为 不可枚举的 属性,可以打印原型上的属性 age;
3)Object.getOwnPropertyNames(obj),可以打印 不可枚举的 属性,不能打印其原型上的属性;