遍历对象方法
一、对象遍历方法
1.for…in
for...in
主要用于循环对象属性。循环中的代码每执行一次,就会对对象的属性进行一次操作。语法如下:
for (let i in obj){
执行的代码块
}
其中两个参数:
- i:必须。指定的变量可以是数组元素,也可以是对象的属性
- obj:必须。指定的迭代的对象
let obj={a:1,b:2,c:3}
for (let i in obj){
console.log('键名:',i)
console.log('键值:',obj[i])
}
⚠️:
for...in
方法不仅会遍历当前对象的可枚举属性,还会遍历其原型链上的属性
2.Object.keys()、Object.values()、Object.entries()
这三个方法都用来遍历对象,它会返回一个由给定对象的自身可枚举属性(不含继承的和Symbol属性)组成的数组,数组元素的排列顺序和正常循环遍历该对象时返回的顺序一致,三个元素返回的值分别如下:
Object.keys()
:返回包含对象键名的数组Object.values()
:返回包含对象键值的数组Object.entries()
:返回包含对象键名和键值的数组
let obj={
id:1,
name:'hello',
age:18
}
console.log(Object.keys(obj)) //['id','name','age']
console.log(Object.values()) //[1,'hello',18]
console.log(Object.entries()) //[['id',1],['name','hello'],['age',18]]
⚠️:
Object.keys()
方法返回的数组中的值都是字符串,也就是说不是字符串的key值会转化为字符串- 结果数组中的属性值都是对象本身可枚举的属性,不包括继承来的属性
3.Object.getOwnPropertyNames()
Object.getOwnPropertyNames()
方法与Object.keys()
类似,也是接受一个对象作为参数,返回一个数组,包含了该对象自身的所有属性名。但它不能返回不可枚举的属性。
let a=['hello','word']
Object.keys(a) //['0','1']
Object.getOwnPropertyNames(a) //['0','1','length']
这两个方法都可以计算对象中属性的个数:
let a={0:'a',1:'b',2:'c'}
Object.getOwnPropertyNames(a) //['0','1','2']
Object.keys(a).length //3
Object.getOwnPropertyNames(a).length //3
4.Object.getOwnPropertySymbols()
Object.getOwnPropertySymbols()
方法返回对象自身的Symbol属性组成的数组,不包括字符串属性:
let obj={a:1}
//给对象添加一个不可枚举的Symbol属性
Object.getOwnPropertySymbols(obj,{
[Symbol('zhu')]:{
value: 'Symbol zhu',
enumerable: false
}
})
//给对象添加一个可枚举的Symbol属性
obj[Symbol('yu')]='Symbol yu'
Object.getOwnPropertySymbols(obj).forEach(key=>{
console.log(obj[key]) //Symbol zhu Symbol yu
})
5.Reflect.ownKeys()
Reflect.ownKeys()
返回一个数组,包含对象自身的属性。它和Object.keys()
类似,Object.keys()
返回属性key,但是不包括不可枚举的属性,而Reflect.ownKeys()
会返回所有属性key:
let obj={
a:1,
b:2
}
Object.defineProperty(obj,'method',{
value:function(){
alert('non enumerable property')
},
enumerable:false
})
console.log(Object.keys(obj)) //['a','b']
console.log(Reflect.ownKeys(obj)) //['a','b','method']
⚠️:
Object.keys()
:相当于返回对象属性数组Reflect.ownKeys()
:相当于Object.getOwnPropertyNames(obj).
concat(Object.getOwnPropertySymbols(obj)
)
总结如下:
对象方法 | 遍历基本属性 | 遍历原型链 | 遍历不可枚举属性 | 遍历Symbol |
---|---|---|---|---|
for…in | 是 | 是 | 否 | 否 |
Object.keys() | 是 | 否 | 否 | 否 |
Object.getOwnPropertyNames() | 是 | 否 | 是 | 否 |
Object.getOwnPropertySymbols() | 否 | 否 | 否 | 是 |
Reflect.ownKeys() | 是 | 否 | 是 | 是 |