JavaScript对象中关键字查找的性能表现

73

我刚刚读到这个问题:JavaScript里有像Python一样的字典吗?

其中一个回答说你可以使用JavaScript对象来代替Python字典。这是真的吗?在对象中查找键的性能如何?是O(1)吗?添加键到对象中的时间复杂度也是常数级别吗(哈希操作)?

3个回答

74
V8设计文档暗示查找速度至少会与此相同,如果不更快:

大多数JavaScript引擎使用类似字典的数据结构作为 存储对象属性的地方 - 每次属性访问需要动态查找以解析属性在内存中的位置。这 种方法使得在JavaScript中访问属性通常比在编程语言中访问实例变量(如Java和Smalltalk)慢得多。在这些语言中,实例变量位于固定偏移量上, 这些偏移量由编译器根据对象类定义的固定对象布局确定。访问只是一个 内存加载或存储,通常只需要一条指令。

为了减少访问JavaScript属性所需的时间,V8不使用动态查找来访问属性。而是,V8在幕后动态 创建隐藏类。[...] 在V8中,当添加新属性时,对象会更改其隐藏类。

听起来添加新的键可能会稍微慢一些,因为需要创建隐藏类。


感谢Domenic!所以,如果我要做更多的查找而不是散列,使用对象查找作为字典查找对我来说似乎是安全的。 - Saher Ahwal
对于V8引擎,使用点符号和方括号符号时都不会使用动态查找,这是真的吗? - Randhir Rawatlal

28

是的,你可以假设添加一个键和之后使用它进行访问是有效的常数时间操作。

在底层,JavaScript引擎可能会应用一些技术来优化后续的查找,但对于任何算法而言,你可以假设它是O(1)。


2
var first = new Map([ [1, 'one'], [2, 'two'], [3, 'three'], ]); 相比,var second={'1': one, '2': two, '3': 'three'} 有多高效? - Yixing Liu

6

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接