JavaScript 中的“let”和“var”之间是否存在性能差异

新手上路,请多包涵

这两个关键字在范围界定方面的区别已经 在这里 进行了彻底讨论,但我想知道两者之间是否存在任何性能差异,如果有,它可以忽略不计,或者在什么时候会变得很重要?

原文由 Nickolai 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 421
2 个回答

http://jsperf.com 上测试后,我得到以下结果: jsperf 宕机了一段时间;请参阅下面的替换代码。

为了检查这一点,我将根据 这个答案 使用以下性能测试,这让我编写了这个函数:

 /**
 * Finds the performance for a given function
 * function fn the function to be executed
 * int n the amount of times to repeat
 * return array [time for n iterations, average execution frequency (executions per second)]
 */
function getPerf(fn, n) {
  var t0, t1;
  t0 = performance.now();
  for (var i = 0; i < n; i++) {
    fn(i)
  }
  t1 = performance.now();
  return [parseFloat((t1 - t0).toFixed(3)), parseFloat((repeat * 1000 / (t1 - t0)).toFixed(3))];
}

var repeat = 100000000;
var msg = '';

//-------inside a scope------------
var letperf1 = getPerf(function(i) {
  if (true) {
    let a = i;
  }
}, repeat);
msg += '<code>let</code> inside an if() takes ' + letperf1[0] + ' ms for ' + repeat + ' iterations (' + letperf1[1] + ' per sec).<br>'

var varperf1 = getPerf(function(i) {
  if (true) {
    var a = i;
  }
}, repeat);
msg += '<code>var</code> inside an if() takes ' + varperf1[0] + ' ms for ' + repeat + ' iterations (' + varperf1[1] + ' per sec).<br>'

//-------outside a scope-----------

var letperf2 = getPerf(function(i) {
  if (true) {}
  let a = i;
}, repeat);
msg += '<code>let</code> outside an if() takes ' + letperf2[0] + ' ms for ' + repeat + ' iterations (' + letperf2[1] + ' per sec).<br>'

var varperf2 = getPerf(function(i) {
  if (true) {}
  var a = i;
}, repeat);
msg += '<code>var</code> outside an if() takes ' + varperf1[0] + ' ms for ' + repeat + ' iterations (' + varperf1[1] + ' per sec).<br>'

document.getElementById('out').innerHTML = msg
 <output id="out" style="font-family: monospace;white-space: pre-wrap;"></output>

在 Chrome 和 Firefox 中对此进行测试后,这表明 letvar 更快,但仅当在与函数的主要范围不同的范围内时。在主要范围内, varlet 在性能上大致相同。在 IE11 和 MS Edge 中, letvar 在这两种情况下的性能大致相同。

按蓝色大按钮,在您最喜欢的浏览器中亲自查看。

目前 let 只有较新的浏览器支持,但较旧的浏览器仍然使用相对较多,这将是一般不使用它的原因。如果您想在旧浏览器无法正常运行的地方使用它,应该没有问题。

编辑: 修改后的答案,因为 jsperf 不工作(参见旧版本的修订历史)。

原文由 Joeytje50 发布,翻译遵循 CC BY-SA 3.0 许可协议

供参考;在 Chrome v60 之后,没有出现进一步的回归。 varlet 并驾齐驱, var 仅以不到1%的优势获胜。现实世界的场景有时会给 var 由于提升和重用的优势,但此时你正在将苹果与橙子进行比较,因为 let 旨在让你避免这种情况行为,因为语义不同。

基准。 Firefox、IE 和 Edge 就像 let 就好了。

原文由 TylerY86 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题