javascript的.length的时间复杂度

时间:2015-09-29 17:53:11

标签: javascript time-complexity

javascript的数组.length的时间复杂度是多少?我认为它会保持不变,因为看起来属性是在所有阵列上自动设置的,你只是在查找它?

2 个答案:

答案 0 :(得分:13)

  

我认为它会保持不变,因为似乎所有数组都会自动设置属性而你只是查找它?

右。 可能。它是一个存储(未计算)并在必要时自动更新的属性。

话虽如此,要记住,JavaScript引擎可以自由地在封面下做他们喜欢的事情,前提是你可以观察到与规范所说的有任何偏差。由于该规范没有说明length ...

的时间复杂度

还要记住,JavaScript的标准数组在理论上只是objects with special behavior。理论上 ,JavaScript对象是属性包。因此,在理论上,查找属性包中的属性可能取决于有多少其他属性,如果对象被实现为某种名称 - >值hashmap(并且它们曾经是旧的,回到过去的旧版本中)天)。现代引擎优化对象(Chrome&#V; V8着名创建动态类并编译它们),但对这些对象的操作仍然可以改变属性查找性能。例如,添加属性可能会导致V8创建子类。删除一个属性(实际上使用delete)可以使V8起手并回到"字典模式,"这大大降低了对象的属性访问权。

换句话说:它可能会有所不同,从引擎到引擎,甚至是对象。但是如果你纯粹使用数组作为数组(不在其上存储其他非数组属性),你很可能会得到恒定时间查找。

答案 1 :(得分:2)

它似乎不是瓶颈但是如果你想确保使用var len = arr.length并检查它。虽然不是一个显着的差异,但它并没有受到伤害,并且在我的机器上似乎更快一点。

var arr = [];
for (var i = 0; i < 1000000; i++) {
  arr[i] = Math.random();
}


var start = new Date();
for (var i = 0; i < arr.length; i++) {
   arr[i] = Math.random(); 
}

var time1 = new Date() - start;
var start = new Date();

for (var i = 0, len = arr.length; i < len; i++) {
  arr[i] = Math.random();
}

var time2 = new Date() - start;

document.getElementById("output").innerHTML = ".length: " + time1 + "<br/>\nvar len: " + time2;
<div id="output"></div>