前端百题斩之—— JS中9种遍历对象的方法

开发 前端
对象是在编程中最常见的部分,很多情况下需要遍历该对象上的属性,那么有几种方式可以帮助我们遍历该对象上的属性呢?下面一起来了解九种方法。

[[400310]]

 1 简介

对象是在编程中最常见的部分,很多情况下需要遍历该对象上的属性,那么有几种方式可以帮助我们遍历该对象上的属性呢?下面一起来了解九种方法。

下面测试方法所用的对象如下所示:

  1. const parentObj = { 
  2.     a: 'aaaaa'
  3.     b: Symbol('bbbbb'), 
  4.     c: 'ccccc' 
  5. }; 
  6.  
  7. const Obj = Object.create(parentObj, { 
  8.     d: { 
  9.         value: 'ddddd'
  10.         enumerable: true 
  11.     }, 
  12.     e: { 
  13.         value: 'eeeee'
  14.         enumerable: false 
  15.     }, 
  16.     [Symbol('f')]: { 
  17.         value: 'fffff'
  18.         enumerable: true 
  19.     } 
  20. }); 

Object.keys(obj)

Object.keys 返回一个所有元素为字符串的数组,其元素来自于从给定的object上面可直接枚举的属性(不含Symbol属性)。这些属性的顺序与手动遍历该对象属性时的一致。

  1. console.log('Object.keys()', Object.keys(Obj)); // Object.keys() [ 'd' ] 

Object.values(obj)

Object.values()返回一个数组,其元素是在对象上找到的可枚举属性值。属性的顺序与通过手动循环对象的属性值所给出的顺序相同。

  1. console.log('Object.values()', Object.values(Obj)); // Object.values() [ 'ddddd' ] 

Object.entries(obj)

Object.entries()返回一个数组,其元素是与直接在object上找到的可枚举属性键值对相对应的数组。属性的顺序与通过手动循环对象的属性值所给出的顺序相同。

  1. console.log('Object.entries()', Object.entries(Obj)); // Object.entries() [ [ 'd''ddddd' ] ] 

Object.getOwnPropertyNames(obj)

Object.getOwnPropertyNames()方法返回一个由指定对象的所有自身属性的属性名(包括不可枚举属性但不包括Symbol值作为名称的属性)组成的数组。

  1. console.log('Object.getOwnPropertyNames()', Object.getOwnPropertyNames(Obj)); // Object.getOwnPropertyNames() [ 'd''e' ] 

Object.getOwnPropertySymbols(obj)

Object.getOwnPropertySymbols() 方法返回一个给定对象自身的所有 Symbol 属性的数组。

  1. console.log('Object.getOwnPropertySymbols()', Object.getOwnPropertySymbols(Obj)); // Object.getOwnPropertySymbols() [ Symbol(f) ] 

for……in

遍历所有可枚举的属性(包括原型上的),然后可利用hasOwnProperty判断对象是否包含特定的自身(非继承)属性,其具有以下特点:

(1)index索引为字符串型数字,不能直接进行几何运算

(2)遍历顺序有可能不是按照实际数组的内部顺序

(3)会遍历数组的所有可枚举属性,包括原型

(4)for...in更适合便利对象,不要使用for...in遍历数组

  1. for(let key in Obj) { 
  2.     // for in: d 
  3.     // for in: a 
  4.     // for in: b 
  5.     // for in: c 
  6.     console.log('for in:'key); 

for……of

必须部署了Iterator接口后才能使用。使用范围:数组、Set和Map结构、类数组对象(arguments、DOMNodeList对象……)、Generator对象以及字符串

  1. for(let value of Object.values(Obj)) { 
  2.     // for of: ddddd 
  3.     console.log('for of:', value); 

forEach

使用break不能中断循环使用

  1. Object.values(Obj).forEach(value => { 
  2.     // forEach: ddddd 
  3.     console.log('forEach:', value); 
  4. }); 

Reflect.ownKeys(obj)

返回一个数组,包含对象自身的所有属性,不管属性名是Symbol还是字符串,也不管是否可枚举。

  1. 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和Map结构、类数组对象、Generator对象以及字符串
forEach break不能中断循环
Reflect.ownKeys(obj) 对象自身所有属性

3 遍历顺序

上述遍历对象的属性时都遵循同样的属性遍历次序规则:

  • 首先遍历所有属性名为数值的属性,按照数字排序
  • 其次遍历所有属性名为字符串的属性,按照生成时间排序
  • 最后遍历所有属性名为Symbol值的属性,按照生成时间排序

用下面代码来验证上述遍历规则

  1. const Obj = { 
  2.     [Symbol(0)]: 'symbol'
  3.     1 : '1'
  4.     'c''c'
  5.     '1a1''11'
  6.     22223333: '2'
  7.     'd''d' 
  8. }; 
  9.  
  10. console.log(Reflect.ownKeys(Obj)); // [ '1''22223333''c''1a1''d', Symbol(0) ] 

本文转载自微信公众号「执鸢者」,可以通过以下二维码关注。转载本文请联系执鸢者公众号。

 

责任编辑:武晓燕 来源: 执鸢者
相关推荐

2021-05-12 07:04:55

Js变量方式

2021-05-30 19:02:59

变量对象上下文

2021-10-19 22:23:05

typeof方式Instanceof

2021-05-09 22:00:59

TypeofInstanceof运算符

2021-06-07 07:01:43

js关键字运行

2021-07-14 07:00:53

浏览器技巧前端

2021-06-02 07:02:42

js作用域函数

2021-07-05 07:02:33

前端跨域策略

2021-06-28 07:12:28

赋值浅拷贝深拷贝

2021-05-16 19:23:11

引用类型包装

2021-07-26 06:57:58

重绘回流前端

2021-06-09 07:01:30

前端CallApply

2021-07-19 07:02:10

浏览器进程单进程浏览器

2021-11-19 09:01:09

防抖节流前端

2021-12-03 06:59:23

操作符验证点属性

2021-07-08 07:01:53

浏览器安全前端

2021-11-03 06:57:41

浏览器Jsonp安全

2021-07-26 05:01:55

浏览器渲染流程

2021-10-18 09:01:01

前端赋值浅拷贝

2021-08-04 06:56:49

HTTP缓存前端
点赞
收藏

51CTO技术栈公众号