据我所知,这let可以防止重复的声明,这很好.
let x;
let x; // error!
Run Code Online (Sandbox Code Playgroud)
声明的变量let也可以用在可以预期的闭包中
let i = 100;
setTimeout(function () { console.log(i) }, i); // '100' after 100 ms
Run Code Online (Sandbox Code Playgroud)
我有点难以理解的是如何let应用于循环.这似乎是for循环特有的.考虑一下经典问题:
// prints '10' 10 times
for (var i = 0; i < 10; i++) { process.nextTick(_ => console.log(i)) }
// prints '0' through '9'
for (let i = 0; i < 10; i++) { process.nextTick(_ => console.log(i)) }
Run Code Online (Sandbox Code Playgroud)
为什么let在这种情况下使用起作用?在我的想象中,即使只有一个块是可见的,for实际上为每个迭代创建一个单独的块,并且let声明在该块内完成......但是只有一个let声明来初始化该值.这只是ES6的语法糖吗?这是怎么回事?
我理解上面和之间的差异 …
我写了一个非常简单的基准:
console.time('var');
for (var i = 0; i < 100000000; i++) {}
console.timeEnd('var')
console.time('let');
for (let i = 0; i < 100000000; i++) {}
console.timeEnd('let')
Run Code Online (Sandbox Code Playgroud)
如果你正在运行Chrome,可以在这里试试(因为NodeJS和Chrome使用相同的JavaScript引擎,虽然版本通常略有不同):
// Since Node runs code in a function wrapper with a different
// `this` than global code, do that:
(function() {
console.time('var');
for (var i = 0; i < 100000000; i++) {}
console.timeEnd('var')
console.time('let');
for (let i = 0; i < 100000000; i++) {}
console.timeEnd('let')
}).call({});Run Code Online (Sandbox Code Playgroud)
结果令我惊讶:
var: 89.162ms
let: 320.473ms
Run Code Online (Sandbox Code Playgroud)
我在Node 4.0.0 && …
给定具有阵列.length 100包含具有值的元素0,以99在相应的索引,其中,所述要求是找到的阵列等于元件n:51.
为什么使用循环从数组的开始迭代到结束比从开始到结束和结束开始更快地迭代?
const arr = Array.from({length: 100}, (_, i) => i);
const n = 51;
const len = arr.length;
console.time("iterate from start");
for (let i = 0; i < len; i++) {
if (arr[i] === n) break;
}
console.timeEnd("iterate from start");Run Code Online (Sandbox Code Playgroud)
const arr = Array.from({length: 100}, (_, i) => i);
const n = 51;
const len = arr.length;
console.time("iterate from start and end");
for (let i = 0, k …Run Code Online (Sandbox Code Playgroud)