当前位置: 首页 > news >正文

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

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 方法 的顺序排列。

【示例】
对上述定义的 obj 遍历:

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 遍历的顺序

Object.keys() 方法遍历的顺序在不同浏览器 JavaScript 引擎中表现不一。
具体表现与 for…in 一致。

【示例】
对上述定义的 obj 遍历:

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

在这里插入图片描述

参考文章

▲ Object.keys(…)对象属性的顺序?
▲ 一起学规范系列 —— Object.keys() 的顺序是如何定义的?
▲ 【JS】for in和for of的前世今生,从Symbol和Iterator讲起

相关文章:

  • vue 实现根据窗口大小自适应图片预览
  • 《计算机网络 自顶向下方法》笔记 - 第二章 应用层
  • 使用 BrowserRouter 报错 invaild hook call 解决方案
  • python中assert关键字的作用
  • CSS3 :nth-child(n)用法
  • CSS3中的transition属性详解
  • HTML中导航栏title前面小图标的实现
  • mysql区分大小写
  • SpringMvc中/和/*的区别
  • varchar 和 varchar2的区别
  • IntelliJ IDEA 各种搜索功能
  • HashMap中的tableSizeFor(int cap)
  • Jdk1.8-HashMap put() 方法tab[i = (n - 1) hash] 解惑
  • JDK1.8源码 resize()解析
  • HashMap中的迭代器
  • [译] 怎样写一个基础的编译器
  • CSS选择器——伪元素选择器之处理父元素高度及外边距溢出
  • CSS中外联样式表代表的含义
  • flutter的key在widget list的作用以及必要性
  • javascript 总结(常用工具类的封装)
  • leetcode-27. Remove Element
  • Otto开发初探——微服务依赖管理新利器
  • React+TypeScript入门
  • Spark学习笔记之相关记录
  • Spring Boot快速入门(一):Hello Spring Boot
  • Work@Alibaba 阿里巴巴的企业应用构建之路
  • 高性能JavaScript阅读简记(三)
  • 工作踩坑系列——https访问遇到“已阻止载入混合活动内容”
  • 基于组件的设计工作流与界面抽象
  • 开源地图数据可视化库——mapnik
  • 理解在java “”i=i++;”所发生的事情
  • 前端每日实战 2018 年 7 月份项目汇总(共 29 个项目)
  • 如何使用Mybatis第三方插件--PageHelper实现分页操作
  • 数据仓库的几种建模方法
  • 思考 CSS 架构
  • 微信小程序开发问题汇总
  • 微信小程序设置上一页数据
  • 系统认识JavaScript正则表达式
  • 以太坊客户端Geth命令参数详解
  • 原生js练习题---第五课
  • ​LeetCode解法汇总2696. 删除子串后的字符串最小长度
  • #1015 : KMP算法
  • #NOIP 2014#day.2 T1 无限网络发射器选址
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • ( 10 )MySQL中的外键
  • (C语言)球球大作战
  • (Python) SOAP Web Service (HTTP POST)
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (强烈推荐)移动端音视频从零到上手(上)
  • (三)mysql_MYSQL(三)
  • (四)库存超卖案例实战——优化redis分布式锁
  • (转)ObjectiveC 深浅拷贝学习
  • (转)用.Net的File控件上传文件的解决方案
  • (轉貼) 蒼井そら挑戰筋肉擂台 (Misc)
  • ******IT公司面试题汇总+优秀技术博客汇总