JavaScript array.length 的时间复杂度

2024-03-04

调用的时间复杂度是多少array.length在 JavaScript 中?我认为它会保持不变,因为似乎属性是在所有数组上自动设置的,而您只是在查找它?


我认为它会是不变的,因为似乎属性是在所有数组上自动设置的,而您只是在查找它?

正确的。它是一个被存储(而不是计算)并根据需要自动更新的属性。规范对此有明确说明here https://tc39.es/ecma262/#sec-arraycreate and here https://tc39.es/ecma262/#sec-array-exotic-objects-defineownproperty-p-desc除其他地方外。

理论上,JavaScript 引擎可以自由计算length在访问时就好像它是一个访问器属性,只要您无法分辨(这意味着它实际上不可能是一个访问器属性,因为您可以在代码中检测到它),但考虑到这一点length被重复使用alot (for (let n = 0; n < array.length; ++n)我想到了),我认为我们可以假设所有广泛使用的 JavaScript 引擎都按照规范执行,或者至少执行恒定时间访问的操作。


FWIW:请记住,JavaScript 的标准数组在理论上只是具有特殊行为的对象 http://blog.niftysnippets.org/2011/01/myth-of-arrays.html. And 理论上, JavaScript 对象是属性包。因此,理论上,如果对象被实现为某种名称->值哈希映射(在过去的糟糕日子里,它们曾经是这样的话),那么在属性包中查找属性可能取决于有多少其他属性)。现代引擎优化对象(众所周知,Chrome 的 V8 动态创建动态类并编译它们),但对这些对象的操作仍然可以改变属性查找性能。例如,添加属性可能会导致 V8 创建子类。删除一个属性(实际上使用delete)可以让 V8 放弃并退回到“字典模式”,这会大大降低对对象的属性访问。

换句话说:它可能会随着引擎的不同、甚至物体的不同而变化。但是,如果您纯粹将数组用作数组(不在其上存储其他非数组属性),那么您很可能会获得恒定时间查找。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JavaScript array.length 的时间复杂度 的相关文章

随机推荐