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

How object basically work when get value by key

我有一个问题,当我们通过键获取值时,对象键值是如何工作的?是否需要先查找键所在的位置,然后 return 对应的值?

例如:如果我们有这样的对象

var obj = { keyX: valueX, keyY: valueY, keyZ: valueZ }

然后我们检索值obj.keyY,那么它是否在那些对象键上一一查找以找到keyY? 那么对于大对象(比如有100万个key的对象),key取值会不会很慢?

感谢任何帮助。谢谢。

Then we retrieve the value obj.keyY, so does it lookup one by one on those object keys to find for keyY?

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

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

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


虽然在学术上很有趣,但在编写代码时不要担心这一点 until/unless 您 运行 会遇到一个性能问题,您可以追踪到 属性 访问速度变慢。 (这是我在 ~20 年的 JavaScript 编码中从未有过的。:-))

小标杆:

//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);

如你所见,不是一一查找