JavaScript 对象遍历方法及其遍历顺序的总结

JavaScript 对象遍历方法及其遍历顺序的总结介绍内部 ownPropertyK 方法 以及 for in for of Object keys Object getOwnProper Symbols Reflect ownKeys 的遍历属性和遍历顺序的差别

JavaScript 对象遍历方法及其遍历顺序的总结

0.从规范中定义的内部 ownPropertyKeys 方法说起

这个方法定义了一个对象的遍历顺序:

  1. 先将 整数属性升序 排列。
  2. 再将 字符串属性定义顺序 排列。
  3. 最后将 Symbol 符号属性定义顺序 排列。

其中,整数属性的定义为:

  • +0 <= parseFloat(key) < 2^32 – 1 (最大安全整数)
  • 不作任何修改便可以与一个整数值相互转换
alert( String(Math.trunc(Number("49"))) ); // "49",相同,整数属性 alert( String(Math.trunc(Number("+49"))) ); // "49",不同于 "+49" ⇒ 不是整数属性 alert( String(Math.trunc(Number("1.2"))) ); // "1",不同于 "1.2" ⇒ 不是整数属性  

这个遍历顺序广泛地应用在了各种遍历方式之中。


1.使用 ownPropertyKeys 遍历顺序的方法

Object.getOwnPropertyNames()

  • 获取所有实例字符串属性的字符串数组。
  • 忽略 Symbol 属性。
  • 无论是否可枚举都会被获取。

Object.getOwnPropertySymbols()

  • 获取所有实例符号(Symbol)属性的数组。
  • 返回结果只有符号属性。
  • 无论是否可枚举都会被获取。

Object.assign()

  • 使用方法: Object.assign(目标对象,一个或多个源对象)
  • 作用:将源对象上的属性复制到目标对象上,并将目标对象的引用返回。
  • 被复制的对象:实例上所有的可枚举属性。
    Object.propertyIsEnumerable() === true &&
    Object.hasOwnProperty() === true




Reflect.ownKeys()

  • 获取所有 实例属性 的数组。
  • 返回结果有 字符串属性 和 符号属性。
  • 无论是否可枚举都会被获取。
  • 相当于Object.getOwnPropertyNames(target).concat(Object.getOwnPropertySymbols(target))

示例:

定义一个 obj 对象:

let s = Symbol("1"); let s2 = Symbol("2"); let obj = { 
     '1e':"1", '0':"2", '+5':"3", [s2]:"3.5", '2':"4", '2haha':"5", [s]:"6", } 

使用下列方式遍历:

console.log(Object.getOwnPropertyNames(obj)) //["0","2","1e","+5","2haha"] console.log(Object.getOwnPropertySymbols(obj)) //[Symbol(2),Symbol(1)] console.log(Reflect.ownKeys(obj)); //["0","2","1e","+5","2haha",Symbol(2),Symbol(1)] console.log(Object.assign({ 
    },obj)); /* { "0":"2", "2":"4", "1e":"1", "+5":"3", "2haha":"5" } */ 

在这里插入图片描述


2.For…of

for…of 可以遍历可迭代对象,即实现了 Symbol.iterator 方法的对象。

2.1 遍历的顺序

遍历的顺序为 调用 Symbol.iterator 工厂方法返回的迭代器中, next() 方法的返回值顺序。


3.For…in

3.1 遍历的范围

▲ for…in 方法可以遍历对象 实例上 的及 原型链上 的 所有 可枚举属性([[Enumerable]]: true)。
▲ 忽略 Symbol 属性。
▲ 对 null / undefined 遍历将不会执行循环体。




3.2 遍历的顺序

for…in 方法遍历的顺序在不同浏览器 JavaScript 引擎中表现不一。

3.2.1 在 Chrome / Opera 中

遵循上述的 ownPropertyKeys 方法 的顺序排列。

for(let k in obj){ 
       console.log(k); } 

在这里插入图片描述

3.2.2 在其他浏览器中

按照属性定义的顺序排列。


4.Object.keys()

4.1 遍历的范围

▲ Object.keys() 方法可以遍历对象 实例上 的所有 可枚举属性
▲ 忽略 Symbol 属性。
▲ 参数为 null / undefined 时会抛出错误。
Uncaught TypeError: Cannot convert undefined or null to object






4.2 遍历的顺序

console.log(Object.keys(obj)); //["0","2","1e","+5","2haha"] 

在这里插入图片描述

参考文章

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/178407.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月26日 下午5:22
下一篇 2026年3月26日 下午5:22


相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号