前端百题斩【005】—— js中9种遍历对象的方法

简介: 前端百题斩【005】—— js中9种遍历对象的方法

1 简介



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

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


const parentObj = {
    a: 'aaaaa',
    b: Symbol('bbbbb'),
    c: 'ccccc'
};
const Obj = Object.create(parentObj, {
    d: {
        value: 'ddddd',
        enumerable: true
    },
    e: {
        value: 'eeeee',
        enumerable: false
    },
    [Symbol('f')]: {
        value: 'fffff',
        enumerable: true
    }
});
  1. Object.keys(obj)


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


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


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


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


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


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


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


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


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


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


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


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

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

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

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


for(let key in Obj) {
    // for in: d
    // for in: a
    // for in: b
    // for in: c
    console.log('for in:', key);
}
  1. for……of


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


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


使用break不能中断循环使用


Object.values(Obj).forEach(value => {
    // forEach: ddddd
    console.log('forEach:', value);
});
  1. 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和Map结构、类数组对象、Generator对象以及字符串
forEach break不能中断循环
Reflect.ownKeys(obj) 对象自身所有属性

3 遍历顺序


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

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

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


const Obj = {
    [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) ]


相关文章
|
12小时前
|
JavaScript
js多维数组去重并使具有相同属性的对象数量相加
js多维数组去重并使具有相同属性的对象数量相加
5 1
|
4天前
|
JavaScript 前端开发 C++
【Web 前端】JavaScript window.onload 事件和 jQuery ready 函数有何不同?
【5月更文挑战第2天】【Web 前端】JavaScript window.onload 事件和 jQuery ready 函数有何不同?
|
4天前
|
JavaScript
Vue.js 中父组件调用子组件的方法
Vue.js 中父组件调用子组件的方法
18 2
|
4天前
|
JavaScript 前端开发 API
Vue.js 中子组件向父组件传值的方法
Vue.js 中子组件向父组件传值的方法
18 2
|
5天前
|
JavaScript 前端开发 开发者
【Web 前端】什么是JS变量提升?
【5月更文挑战第1天】【Web 前端】什么是JS变量提升?
【Web 前端】什么是JS变量提升?
|
6天前
|
JSON JavaScript 前端开发
【JavaScript技术专栏】JavaScript的跨域通信方法
【4月更文挑战第30天】本文探讨了JavaScript中的跨域通信方法,包括:同源策略和跨域通信的概念,以及JSONP、CORS、WebSockets、`window.postMessage()`、代理服务器和WebAssembly的使用。这些技术各有优劣,适用于不同的场景,是Web开发者解决跨域问题的关键工具。随着Web技术的演进,跨域通信的解决方案也将不断更新。
|
6天前
|
缓存 前端开发 JavaScript
【JavaScript 技术专栏】JavaScript 前端路由实现原理
【4月更文挑战第30天】本文探讨了JavaScript前端路由在SPA中的重要性,阐述了其基本原理和实现方式,包括Hash路由和History路由。前端路由通过监听URL变化、匹配规则来动态切换内容,提升用户体验和交互性。同时,文章也提到了面临的SEO和页面缓存挑战,并通过电商应用案例分析实际应用。理解并掌握前端路由能助开发者打造更流畅的单页应用。
|
7天前
|
前端开发 JavaScript 数据安全/隐私保护
前端javascript的DOM对象操作技巧,全场景解析(二)
前端javascript的DOM对象操作技巧,全场景解析(二)
|
5月前
|
前端开发 JavaScript
《Webpack5 核心原理与应用实践》学习笔记-> 构建微前端应用
《Webpack5 核心原理与应用实践》学习笔记-> 构建微前端应用
41 1
|
9月前
|
Web App开发 前端开发 JavaScript
前端学习笔记202307学习笔记第五十七天-模拟面试笔记react-fiber解决了什么问题
前端学习笔记202307学习笔记第五十七天-模拟面试笔记react-fiber解决了什么问题
98 0