获取对象的大小通常包括迭代和计数,或者Object.keys(obj).length,它也是O(n)。如果我切换到Map,我可以假设Map.size在O(1)中运行吗?
我对Javascript很新,来自C ++世界,我很震惊,我找不到一个标准来规定语言提供的所有功能的时间复杂性。
答案 0 :(得分:2)
除了您已经检查过源代码或凭经验证明它的实现外,您无法依赖它。 The specification表明Map.prototype.size
是一个带循环逻辑的getter:
获取Map.prototype.size
Map.prototype.size是一个访问器属性,其set访问器函数为 undefined 。它的get访问器函数执行以下步骤:
- 让 M 为此值。
- 如果 Type ( M )不是Object,则抛出TypeError异常。
- 如果 M 没有[[MapData]]内部插槽,则抛出TypeError异常。
- 让条目成为 M ' s [[MapData]]内部广告位的值。
- 让计数为0。
- 对于每个记录{[[Key]],[[Value]]} p ,它是条目的元素
- 如果 p 。[[Key]]不为空,请将 count 设置为 count +1。
- 返回计数。
醇>
但是如果size
的语义不变,那么实现可以自由优化。