为了账号安全,请及时绑定邮箱和手机立即绑定

按键获取值时对象的基本工作原理

按键获取值时对象的基本工作原理

守着一只汪 2023-01-06 11:06:08
我有一个问题,当我们通过键获取值时,对象键值如何工作?是否需要先查找key所在的位置,然后返回对应的值?例如:如果我们有像这样的对象var obj = { keyX: valueX, keyY: valueY, keyZ: valueZ }然后我们检索值obj.keyY,那么它是否在那些对象键上一一查找以找到keyY?那么对于大对象(比如有100万个key的对象),key取值会不会很慢?我感谢任何帮助。谢谢你。
查看完整描述

2 回答

?
烙印99

TA贡献1829条经验 获得超13个赞

然后我们检索值obj.keyY,那么它是否在那些对象键上一一查找以找到keyY?

这取决于实现,但即使在旧的 JavaScript 引擎中,答案是否定的,它比那要高效得多。对象属性访问是一个非常常见的操作,因此 JavaScript 引擎积极优化它,并且在这样做时非常复杂。

在现代 JavaScript 引擎中,对象通常被优化为即时生成的类机器代码,因此属性查找速度快得令人眼花缭乱。如果由于某种原因它们没有被优化(可能只是不经常使用),通常会使用像哈希表这样的结构,因此查找仍然比线性访问(查看每个属性)要好得多。

具有大量属性或随时间变化的属性的对象可能不如具有更合理数量的属性的对象优化得好。但它们至少会被优化(在任何模糊现代的事物中)到哈希表级别的访问时间。(FWIW:对于随着时间的推移具有不同属性的对象,首先使用 a 可能会更好Map。)


虽然在学术上很有趣,但在编写代码时不要担心这一点,直到/除非你遇到性能问题,你追踪到缓慢的属性访问。(这是我在 ~20 年的 JavaScript 编码中从未有过的。:-))


查看完整回答
反对 回复 2023-01-06
?
Cats萌萌

TA贡献1805条经验 获得超9个赞

小基准:


//setup..

for(var obj = {}, i =0; i<1000000; obj['key'+i] = i++);

var a;

//find 1

console.time(1);

a = obj.key1;

console.timeEnd(1);

//find last

console.time(2);

a = obj.key999999;

console.timeEnd(2);

如您所见,它不是一个一个地查找



查看完整回答
反对 回复 2023-01-06
  • 2 回答
  • 0 关注
  • 122 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信