js 循环对象时,输出顺序为什么会乱?

先看一个demo

在这里插入图片描述

输出顺序

在这里插入图片描述

从 这里可以看出,数字按升序的顺序输出,字符串按,创建时的顺序输出,这也是ECMAScript规范中定义

  • 「数字属性应该按照索引值⼤⼩升序排列,字符串属性根据创建时的顺序升序排列。并且数字属性优先于字符串」

下面我们来看下这个规范下实现的过程以及原因

  • 首先JS代码本身是不会直接被计算机执行,计算机只能接收二进制的汇编代码,所以,中间需要一层转化,而这个转化,在chrom就是v8引擎

在v8 里是怎么样存储和读取对象属性的呢,

  1. 在v8里,将对象里的属性,分为两大类。数字类型,叫排序属性,在v8里叫elements。字符串类型,叫常规属性,在v8里叫properties。
    在v8里,为了有效的存储和访问这对象属性,分别使用两个线性结构来保存这两个属性。

  2. 在elements对象中,会按照顺序存放排序属性,properties属性则指向了properties对 象,在properties对象中,会按照创建时的顺序保存了常规属性。

  3. 但是这样也存在一个问题,在查找排序属性时,直接通过索引即可。但是对象,需要找到properties,然后找到propteries里的属性,这样无疑多了一层操作,所以引入了一个新名词 对象内属性( in- object properties)

  4. 但是常规属性也有个数限制,超过是个,默认是10个,就要开辟新的空间来保存常规属性

针对数量少的对象属性,采用以上策略完全没有问题,但是对象数量多了以后,会采用排序非线性字典结构来存储

线性结构:是一个有序数据元素的集合。常见线性结构, 线性表,栈,队列,双队列,串(一维数组)
非线性结构: 其逻辑特征是一个结点元素可能有多个直接前驱和多个直接后继。
那这个时候,通过线性结构来存储数据,查找肯定的快的,但是如果涉及到大量的修改数据,那么动一发而牵全身,是非常耗性能的,所以数据多了,v8采用了慢排序

快排序: 采用线性结构

慢排序:采用非线性结构 ,比如字典

现在我们来回顾一下,循环对象时,顺序为什么会乱?

  1. 这本身就是一个ECMA的一个规范,数字按升序输出,字符串按创建顺序输出,并且数字优先级高于字符串
  2. JS本身是不能被计算机识别,需要通过V8转化为字节码
  3. 那么针对ECMA的一个规范,v8对这个规范做的优化策略
  4. 排序属性 elements,用来存储数字。 常规属性 properties 用来存储字符串。为了优化,引入对象内属性
  5. 对象属性多后,会采用慢属性来存储数据,快属性就是采用线性数据结构,慢属性就是采用非线性结构,比如字典来存储数据。
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值