Нет ли разницы между let и const внутри for цикла в Javascript с точки зрения объявления? - PullRequest
2 голосов
/ 25 сентября 2019

Я недавно сталкивался с этим кодом:

for (const temp of [1,2]) {
  // do something
}

Я думал, что было бы лучше использовать объявление let для temp, потому что таким образом переменная будет объявлена ​​только один раз.Тем не менее, я также запустил этот пример и версию с let через babel, и вот что я вижу:

for (const p of [1,2]) {

}

for (let s of [1,2]) {

}

стало:

for (var _i = 0, _arr = [1, 2]; _i < _arr.length; _i++) {
  var p = _arr[_i];
}

for (var _i2 = 0, _arr2 = [1, 2]; _i2 < _arr2.length; _i2++) {
  var s = _arr2[_i2];
}

Так что babel лечит const и let идентично.Мне интересно, относится ли среда выполнения Javascript к двум версиям одинаково под капотом.Вывод таков: даже если переменная объявлена ​​с let внутри цикла, она все равно будет повторно объявлена ​​на каждой итерации?

1 Ответ

7 голосов
/ 25 сентября 2019

Я подумал, что было бы лучше использовать объявление let для temp, потому что таким образом переменная будет объявлена ​​только один раз.

Существует новая версия, объявленная для каждой итерации цикла, либопуть;это важно для решения проблемы замыканий в циклах:

const array = [1, 2, 3, 4];
for (const entry of array) {
    setTimeout(() => {
        console.log(entry);
    }, 0);
}

Если бы не создавалась новая переменная для каждой итерации цикла, она бы записывала одно и то же значение (вероятно, 4) четыре раза.

Выбор let или const уменьшен до:

  1. Хотите ли вы иметь возможность присвоить ему новое значение в цикле?

  2. Ваш личный стиль (или предпочтения вашей команды).

Мне интересно, обрабатывает ли среда выполнения Javascript две версии одинаково под капотом.

Да, кроме этого вы можете присвоить переменной let новое значение в цикле, если хотите. Instance Например:

const strings = ["a", "b", "c"];
for (let str of strings) {
    str = str.toUpperCase();
    console.log(str);
}

Например, единственная разница в том, является ли переменная изменчивой или нет.


¹ Во избежание сомнений: все, чтоприсвоение ему - это изменение значения этой переменной.Это не влияет на массив / итерируемый, из которого получено значение.

...