1简介对象是编程中最常见的部分。很多时候需要遍历对象上的属性,那么有几种方法可以帮助我们遍历这个对象上的属性呢?让我们一起来了解这九种方法吧。以下测试方法中使用的对象如下:constparentObj={a:'aaaaa',b:Symbol('bbbbb'),c:'ccccc'};constObj=Object.create(parentObj,{d:{value:'dddd',enumerable:true},e:{value:'eeeee',enumerable:false},[Symbol('f')]:{value:'fffff',enumerable:true}});Object.keys(obj)Object.keys返回一个数组,其元素为字符串,其元素来自可以从给定对象直接枚举的属性(不包括Symbol属性)。这些属性的顺序与手动遍历对象的属性时的顺序相同。console.log('Object.keys()',Object.keys(Obj));//Object.keys()['d']Object.values(obj)Object.values()返回一个数组,其元素为Enumerable在对象上找到的属性值。属性的顺序与通过手动循环遍历对象的属性值给出的顺序相同。console.log('Object.values()',Object.values(Obj));//Object.values()['dddddd']Object.entries(obj)Object.entries()返回一个数组,其元素为An对应于直接在对象上找到的可枚举属性键值对的数组。属性的顺序与通过手动循环遍历对象的属性值给出的顺序相同。console.log('Object.entries()',Object.entries(Obj));//Object.entries()[['d','ddddd']]Object.getOwnPropertyNames(obj)Object.getOwnPropertyNames()方法返回一个数组,该数组由指定对象的所有自身属性的属性名组成(包括不可枚举的属性,但不包括以Symbol值作为名称的属性)。console.log('Object.getOwnPropertyNames()',Object.getOwnPropertyNames(Obj));//Object.getOwnPropertyNames()['d','e']Object.getOwnPropertySymbols(obj)Object.getOwnPropertySymbols()返回一个An给定对象本身的所有Symbol属性的数组。console.log('Object.getOwnPropertySymbols()',Object.getOwnPropertySymbols(Obj));//Object.getOwnPropertySymbols()[Symbol(f)]for...in遍历所有可枚举属性(包括原型上的),然后可以使用hasOwnProperty来判断对象是否包含特定的自身(非继承)属性,它具有以下特点:(1)索引index是一个字符串数字,不能直接进行几何运算(2)遍历order可能不遵循实际数组内部顺序(3)会遍历数组的所有可枚举属性,包括原型(4)for...in更适合convenienceobjects,不要使用for...in来遍历数组for(letkeyinObj){//forin:d//forin:a//forin:b//forin:cconsole.log('forin:',key);}for...of之前必须部署Iterator接口它可以使用。使用范围:数组、Set和Map结构、类数组对象(参数、DOMNodeList对象...)、Generator对象和字符串for(letvalueofObject.values(Obj)){//forof:dddddconsole.log('forof:',value);}forEach无法使用break使用Object.values(Obj).forEach(value=>{//forEach:ddddconsole.log('forEach:',value);});返回Reflect.ownKeys(obj)包含对象自身所有属性的数组,无论属性名是Symbol还是字符串,是否可枚举。console.log('Reflect.ownKeys()',Reflect.ownKeys(Obj));//Reflect.ownKeys()['d','e',Symbol(f)]2个特征总结类型特征Object.keys(obj)返回对象本身的可直接枚举属性(不包括Symbol属性)Object.values(obj)返回对象本身的可直接枚举属性值(不包括Symbol属性)Object.entries(obj)返回的可枚举属性对象本身属性键值对对应的数组(不包括Symbol属性)Object.getOwnPropertyNames(obj)返回对象所有属性的属性名称(不包括以Symbol值作为名称的属性)Object.getOwnPropertySymbols(obj)返回给定对象自身所有Symbol属性的数组for...in所有可枚举属性(包括原型上的)for...of部署Iterator接口后才能使用,如数组,Set和映射结构、类数组对象和生成器对象ectsandthestringforEachbreakcannotbreaktheloopReflect.ownKeys(obj)对象本身的所有属性3遍历顺序遍历对象的上述属性如下相同的属性遍历顺序规则:先遍历所有属性名为value的属性,按编号排序,其次遍历所有属性名为string的属性,按生成时间排序,最后遍历所有属性名为Symbolvalue的属性,按排序生成时间使用如下代码验证上述遍历规则constObj={[Symbol(0)]:'symbol',1:'1','c':'c','1a1':'11',22223333:'2','d':'d'};console.log(Reflect.ownKeys(Obj));//['1','22223333','c','1a1','d',Symbol(0)]本文转载自微信公众号“执狐者”,您可以通过以下二维码关注转载文章,请联系捧风筝公众号。
