这两个关键字在范围上的区别已经在这里进行了充分的讨论,但是我想知道两者之间是否存在任何性能差异,如果可以,那么可以忽略不计,或者在什么时候变得有意义?
在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中进行测试后,这表明它let
的速度比快var
,但仅在与函数的主作用域不同的作用域内时才如此。在主要范围内,var
并且let
性能大致相同。在IE11和MS边缘,let
并且var
在这两种情况下的性能大致相等。
按下蓝色的大按钮,即可在您喜欢的浏览器中亲自查看。
目前let
已经从只有较新的浏览器的支持,但旧的浏览器仍在使用比较多的,这将是一个理由,一般不使用它。如果您想在其他浏览器无法正常运行的地方使用它,则应该没有问题。
编辑:由于jsperf无法正常工作,因此修改了答案(请参阅旧版本的修订历史记录)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句