В чем разница между "let" и "const" ECMAScript 2015 (ES6)?

Мне интересно, в чем разница между let и const в ES6. Оба они имеют блочную область, как показано в следующем коде:

const PI = 3.14;
console.log(PI);

PI = 3;
console.log(PI);

const PI = 4;
console.log(PI);

var PI = 5;
console.log(PI);

В ES5 вывод будет:

3.14
3.14
3.14
3.14

Но в ES6 это будет:

3.14
3
4
5

Мне интересно, почему ES6 допускает изменение значения const, вопрос в том, почему мы должны использовать "const" сейчас? мы можем использовать вместо этого "пусть"?

Примечание: jsbin можно использовать для тестирования, выберите JavaScript для запуска кода ES5 и Traceur для запуска его с возможностями ES6.

Ответ 1

То, что вы видите, - это просто ошибка реализации. Согласно вики спецификации ES6 на const, const:

Инициализация-один раз, только для чтения, после этого обязательная форма является полезной и имеет прецедента в существующих реализациях, в виде const деклараций.

Он предназначен только для чтения, как сейчас. Реализация ES6 const в Traceur и Continuum является ошибкой (они, вероятно, просто упускают из виду)

Здесь проблема Github, касающаяся Traceur, не реализующая const

Ответ 2

Разница между let и const заключается в том, что после привязки значения/объекта к переменной с помощью const вы не можете переназначить эту переменную. Пример:

const something = {};
something = 10; // Error.

let somethingElse = {};
somethingElse = 1000; // This is fine.

Обратите внимание, что const не делает что-то неизменяемым.

const myArr = [];
myArr.push(10); // Works fine.

Вероятно, лучший способ сделать объект (неглубоко) неизменным на данный момент - использовать Object.freeze() на нем.

Ответ 3

пусть

  • Использовать область блока в программировании.
  • для каждого блока позволяет создать свою собственную новую область, к которой вы не можете получить доступ за пределами этого блока.
  • значение может быть изменено столько раз, сколько вы хотите.
  • let чрезвычайно полезен для подавляющего большинства кода. Это может значительно повысить читаемость кода и уменьшить вероятность ошибки программирования.

    let abc = 0;
    
    if(true)
     abc = 5 //fine
    
    if(true){
      let def = 5
    }
    console.log(def)
    

Const

  • Это позволяет вам быть неизменными с переменными.
  • const является хорошей практикой как для удобочитаемости, так и для удобства обслуживания и позволяет избежать использования магических литералов, например.

    // Low readability
    if (x > 10) {
    }
    
    //Better!
    const maxRows = 10;
    if (x > maxRows) {
     }
    
  • Объявления const должны быть инициализированы

     const foo; // ERROR: const declarations must be initialized
    
  • A const - это скопированный блок, как мы видели с let: +
const foo = 123;
if (true) {
    const foo = 456; // Allowed as its a new variable limited to this `if` block
}

Ответ 4

let и const

Переменные, объявленные с let и const устраняют конкретную проблему подъема, поскольку они привязаны к блоку, а не к функции.

Если переменная объявляется с использованием let или const внутри блока кода (обозначается фигурной скобкой {}), то переменная застревает в так называемой временной мертвой зоне до тех пор, пока не будет обработано объявление переменных. Такое поведение предотвращает доступ к переменным только до тех пор, пока они не будут объявлены.

Правила использования let и const

let и const также обладают некоторыми другими интересными свойствами.

  • Переменные, объявленные с let могут быть переназначены, но не могут быть переопределены в той же области.
  • Переменные, объявленные с помощью const должны иметь начальное значение, но не могут быть переопределены в той же области действия и не могут быть переназначены.

Случаи применения

Большой вопрос: когда следует использовать let и const? Общее эмпирическое правило выглядит следующим образом:

  • используйте let когда вы планируете переназначить новые значения переменной, и
  • используйте const когда вы не планируете переназначать новые значения переменной.

Поскольку const является самым строгим способом объявить переменную, предполагается, что вы всегда объявляете переменные с const потому что это упростит ваш код, поскольку вы знаете, что идентификаторы не будут меняться на протяжении всей жизни вашей программы. Если вы обнаружите, что вам необходимо обновить переменную или изменить его, а затем вернитесь и выключите его из const, чтобы let.

Ответ 5

Резюме:

Ключевое слово let и const являются способами объявления переменных блока. Есть одно большое отличие:

  • Переменные, объявленные с помощью let могут быть переназначены.
  • Переменные, объявленные с помощью const должны быть инициализированы при объявлении и не могут быть переназначены.

Если вы попытаетесь переназначить переменные с объявленным с ключевым словом const вы получите следующую ошибку (chrome devtools):

const reassignment error

Почему мы должны использовать это?

Если мы знаем, что хотим присвоить переменную один раз, и что мы не хотим переназначать переменную, использование ключевых слов const дает следующие преимущества:

  • Мы сообщаем в нашем коде, что не хотим переназначать переменную. Таким образом, если другие программисты обращаются к вашему коду (или даже к вашему собственному коду, который вы написали некоторое время назад), вы знаете, что переменные, объявленные с помощью const, переназначать не следует. Таким образом, наш код становится более декларативным и с ним легче работать.
  • Мы применяем принцип невозможности переназначения переменной (двигатель JS выдает ошибку). Таким образом, если вы случайно попытаетесь переназначить переменную, которая не предназначена для переназначения, вы можете обнаружить это на более ранней стадии (потому что она вошла в консоль).

Предостережение:

Хотя переменная, объявленная с помощью const не может быть переназначена, это не означает, что назначенный объект не является изменяемым. Например:

const obj = {prop1: 1}

// we can still mutate the object assigned to the 
// variable declared with the const keyword
obj.prop1 = 10;
obj.prop2 = 2;

console.log(obj);

Ответ 6

Вот некоторые заметки, которые я взял, которые помогли мне в этом вопросе. Также сравнивает const и let to var.

Здесь о var:

// Var
// 1. var is hoisted to the top of the function, regardless of block
// 2. var can be defined as last line and will be hoisted to top of code block
// 3. for undefined var //output error is 'undefined' and code continues executing
// 4. trying to execute function with undefined variable
// Example: // log(myName); // output: ReferenceError: myName is not defined and code stops executing 

Вот о let и const:

// Let and Const
// 1. use 'const' to declare variables which won't change
// 2. 'const' is used to initialize-once, read-only thereafter
// 3. use 'let' to declare variables which will change
// 4. 'let' or 'const' are scoped to the "block", not the function
// 5. trying to change value of const and then console.logging result will give error
// const ANSWER = 42;
// ANSWER = 3.14159;
// console.log(ANSWER);
// Error statement will be "TypeError: Assignment to constant variable." and code will stop executing
// 6. 'let' won't allow reference before definition
// function letTest2 () {
//   log(b);
//   let b = 3;}
// Error statement will be "ReferenceError: b is not defined." and code will stop executing

Ответ 7

ES6 пусть и const

Новое let позволяет объявлять переменную, ограниченную по объему блоком (локальная переменная). Основное отличие состоит в том, что область видимости переменной var представляет собой всю включающую функцию:

if (true) {
  var foo = 42; // scope globally
}

console.log(foo); // 42

Использование блоков let in:

if (true) {
  let foo = 42; // scoped in block
}

console.log(foo); // ReferenceError: bar is not defined

Использование var в области действия аналогично использованию let:

function bar() {
  var foo = 42; // scoped in function
}

console.log(foo); // ReferenceError: bar is not defined

Ключевое слово let присоединяет объявление переменной к области действия любого блока, в котором оно содержится. С другой стороны, использование ES6 const очень похоже на использование let, но после присвоения значения его нельзя изменить. Используйте const качестве неизменного значения, чтобы предотвратить случайное переназначение переменной:

const num = 42;

try {
  num = 99;
} catch(err) {
  console.log(err);
  // TypeError: invalid assignment to const 'number'

}

num; // 42

Используйте const для присвоения переменных, которые являются постоянными в реальной жизни (например, температура замерзания, PI, дата рождения и т.д.). Всегда рекомендуется использовать только let и const, тем самым вы устраняете склонное к ошибкам поведение с подъемом переменных. JavaScript const не предназначен для создания неизменяемых значений, он не имеет никакого отношения к значению, const предотвращает повторное назначение другого значения переменной и переводит переменную в состояние только для чтения. Однако значения всегда можно изменить:

const arr = [0, 1, 2];
arr[3] = 3; // [0, 1, 2, 3]

Чтобы предотвратить изменение значения, используйте Object.freeze():

let arr = Object.freeze([0, 1, 2]);
arr[0] = 5;

arr; // [0, 1, 2]

Частный случай, когда let действительно полезен, находится в цикле for:

for (let i = 0; i <= 5; i++) {
  console.log(i);
}

// 0 1 2 3 4 5

console.log(i); // ReferenceError, great! i is not global