我刚刚读到这个问题:JavaScript里有像Python一样的字典吗?
其中一个回答说你可以使用JavaScript对象来代替Python字典。这是真的吗?在对象中查找键的性能如何?是O(1)吗?添加键到对象中的时间复杂度也是常数级别吗(哈希操作)?
我刚刚读到这个问题:JavaScript里有像Python一样的字典吗?
其中一个回答说你可以使用JavaScript对象来代替Python字典。这是真的吗?在对象中查找键的性能如何?是O(1)吗?添加键到对象中的时间复杂度也是常数级别吗(哈希操作)?
大多数JavaScript引擎使用类似字典的数据结构作为 存储对象属性的地方 - 每次属性访问需要动态查找以解析属性在内存中的位置。这 种方法使得在JavaScript中访问属性通常比在编程语言中访问实例变量(如Java和Smalltalk)慢得多。在这些语言中,实例变量位于固定偏移量上, 这些偏移量由编译器根据对象类定义的固定对象布局确定。访问只是一个 内存加载或存储,通常只需要一条指令。
为了减少访问JavaScript属性所需的时间,V8不使用动态查找来访问属性。而是,V8在幕后动态 创建隐藏类。[...] 在V8中,当添加新属性时,对象会更改其隐藏类。
听起来添加新的键可能会稍微慢一些,因为需要创建隐藏类。
是的,你可以假设添加一个键和之后使用它进行访问是有效的常数时间操作。
在底层,JavaScript引擎可能会应用一些技术来优化后续的查找,但对于任何算法而言,你可以假设它是O(1)。
var first = new Map([ [1, 'one'], [2, 'two'], [3, 'three'], ]);
相比,var second={'1': one, '2': two, '3': 'three'}
有多高效? - Yixing Liu请看类似问题JavaScript VM如何实现对象属性访问?以及答案。在这里,我描述了JS引擎使用的优化技术以及它如何影响键查找性能。希望这些细节能帮助您编写更高效的JS代码。