前端每日一练:js你可能不知道的隐藏类、快速模式、字典模式

隐藏类

问题:以下哪段代码运行效率更高(隐藏类)​

const obj1 = {​
a: 1​
}​

const obj2 = {​
a: 1​
}​

const obj3 = {​
a: 1​
}​

这三个对象都有相同的属性a,它们的隐藏类是相同的,因为它们有相同的属性布局。这可以提高属性访问的性能,因为引擎可以使用相同的隐藏类进行优化。 

const obj1 = {​
a: 1​
}​

const obj2 = {​
b: 1​
}​

const obj3 = {​
c: 1​
}​

​

这三个对象有不同的属性,它们的隐藏类是不同的,因为它们有不同的属性布局。在访问属性时,引擎可能需要切换隐藏类,这可能导致性能下降。

在计算机科学中,尤其是在JavaScript引擎中,"隐藏类"是一种用于优化对象属性访问的技术。具体来说,隐藏类是一种内部的数据结构,用于追踪和优化对象的属性布局和访问方式。

在JavaScript中,对象的属性可以动态地添加和删除,这就引入了一些性能开销。为了提高属性访问的速度,JavaScript引擎会使用隐藏类来跟踪对象的属性和方法。

以下是隐藏类的一些关键概念:

  1. 初始化隐藏类: 当第一个对象被创建时,引擎会创建一个初始的隐藏类。这个隐藏类包含了这个对象的属性和方法。

  2. 添加属性: 当对象的属性被动态添加时,引擎会根据当前隐藏类创建一个新的隐藏类,包含新的属性。这个过程可能导致隐藏类的转换。

  3. 访问属性: 引擎通过查找对象的隐藏类来快速访问属性。如果对象的隐藏类匹配当前引擎的预期,那么属性访问会更加高效。

  4. 形状(Shape): 在某些文献中,隐藏类也被称为"形状"。一个对象的形状是指它的隐藏类和属性的组合。

  5. 内联缓存(Inline Cache): 引擎使用内联缓存来加速属性访问。内联缓存是一个记录隐藏类和属性关系的缓存,用于快速查找属性。

  6. 优化和降级: 当对象的属性访问模式发生变化时,引擎可能会重新优化隐藏类,或者进行降级,以适应新的情况。

总体而言,隐藏类的使用是为了提高对象属性访问的性能。这是JavaScript引擎中的一项重要优化技术,有助于加速代码的执行。

在JavaScript中,数组有两种模式:快速模式(Fast Elements)和字典模式(Dictionary Elements)。

快速模式

在快速模式下,数组元素按照索引顺序排列,访问速度较快。在第一个示例中,数组arr1是通过逐个设置元素的方式构建的,它将以快速模式存储。

const arr1 = []; 
for (let i = 0; i < 10000000; ++i) {
 arr1[i] = 1;
 }

字典模式

在字典模式下,数组元素的索引不是按顺序排列的,可能包含空洞,访问速度相对较慢。在第二个示例中,数组arr2先通过直接设置最大索引处的元素,然后再逐个设置其他元素,这可能导致arr2以字典模式存储。

const arr2 = []; 
arr2[10000000 - 1] = 1; 
for (let i = 0; i < 10000000; ++i) { 
  arr2[i] = 1;
 }

在大多数情况下,第一个示例的效率更高,因为它使用了逐个设置元素的方式,这有助于数组以快速模式存储。第二个示例可能会导致数组以字典模式存储,降低了访问速度。

注意: 引擎的优化行为可能因引擎和具体环境而异。在实际应用中,可以根据实际需求和具体环境进行性能测试。

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值