Jaka jest różnica między " let " i "const" ECMAScript 2015 (ES6)?

Zastanawiam się jaka jest różnica między let A const W ES6 . Oba z nich mają zasięg blokowy, jak przykład w poniższym kodzie:

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

PI = 3;
console.log(PI);

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

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

W ES5 wyjście będzie:

3.14
3.14
3.14
3.14

Ale w ES6 będzie:

3.14
3
4
5

Zastanawiam się dlaczego ES6 pozwala na zmianę wartości const, pytanie brzmi Dlaczego powinniśmy teraz używać 'const'? możemy zamiast tego użyć 'let'?

Uwaga: jsbin może być używany do testowania, wybierz JavaScript to run ES5 code and Traceur to run it with ES6 function.

Author: Shakespear, 2014-03-10

9 answers

To, co widzisz, to tylko błąd w implementacji. Według ES6 Spec wiki na const, const jest:

Initialize-once, read-only następnie formularz wiążący jest użyteczny i ma precedens w istniejących wdrożeniach, w postaci const deklaracje.

Ma być tylko do odczytu, tak jak jest obecnie. Implementacja ES6 const W Traceur i Continuum jest błędna (prawdopodobnie po prostu ją przeoczyli)

Oto Github problem dotyczący niewprowadzania Traceurconst

 25
Author: Some Guy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-10 19:12:07

Różnica między let i const polega na tym, że po powiązaniu wartości/obiektu ze zmienną za pomocą const, nie można ponownie przypisać do tej zmiennej. Innymi słowy przykład:

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

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

Szczegóły pytania twierdzą, że jest to zmiana z ES5 - to jest rzeczywiście nieporozumienie. Użycie const w przeglądarce, która obsługuje tylko ECMAScript 5, zawsze spowoduje błąd. Twierdzenie const nie istnieje w ECMAScript 5. Zachowanie w jest albo js Bin jest mylące co do tego, jaki rodzaj JavaScript jest uruchamiany, albo to błąd przeglądarki.

W praktyce przeglądarki nie tylko przechodziły od 0% wsparcia dla ECMAScript 2015 (ECMAScript 6) do 100% za jednym razem - funkcje są dodawane bit po bitach, dopóki przeglądarka nie będzie w pełni zgodna. To, co js Bin nazywa "JavaScript", oznacza po prostu to, co ECMAScript obsługuje obecnie twoja przeglądarka - nie oznacza " ES5 " lub " ES6 " ani niczego innego. Wiele przeglądarek obsługiwało const i let zanim w pełni obsługiwały ES6, ale niektóre (jak Firefox) traktowały const jak let przez jakiś czas. Jest prawdopodobne, że przeglądarka pytającego obsługiwała let i const, ale nie zaimplementowała ich poprawnie.

Po Drugie, narzędzia takie jak Babel i Traceur nie sprawiają, że ES6 "działa" w starszej przeglądarce - zamiast tego zmieniają kod ES6 w ES5, który robi mniej więcej to samo. Traceur prawdopodobnie zamienia const stwierdzenia w var stwierdzenia, ale wątpię, aby zawsze wymuszało to, że semantyka const stwierdzenia są dokładnie replikowane w ES5. Korzystanie z JS Bin do uruchomienia ES6 przy użyciu Traceur nie da dokładnie takich samych wyników jak uruchomienie ES6 w przeglądarce w pełni zgodnej ze specyfikacją ES6.


Ważne jest, aby pamiętać, że const nie czyni wartości lub obiektu niezmiennym.

const myArray = [];
myArray.push(1); // Works fine.
myArray[1] = 2; // Also works fine.
console.log(myArray); // [1, 2]
myArray = [1, 2, 3] // This will throw.

Prawdopodobnie najlepszym sposobem na uczynienie obiektu (płytko) niezmiennym w tej chwili jest użycie Object.freeze() na nim. Jednak to sprawia, że sam obiekt jest tylko do odczytu; wartości właściwości obiektu mogą być nadal mutowane.

 63
Author: Thomas Foster,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-11-15 17:11:36

Let

  • Użyj zakresu blokowego w programowaniu.
  • dla każdego bloku Stwórz swój własny nowy zakres, do którego nie możesz uzyskać dostępu poza tym blokiem.
  • wartość może być zmieniana tyle razy, ile chcesz.
  • Let jest niezwykle przydatny dla zdecydowanej większości kodu. Może znacznie zwiększyć czytelność kodu i zmniejszyć ryzyko błędu programowania.

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

Const

  • pozwala być niezmiennym z zmienne.
  • Const jest dobrą praktyką zarówno pod względem czytelności, jak i konserwacji i unika używania literałów magicznych, np.]}
    // Low readability
    if (x > 10) {
    }
    
    //Better!
    const maxRows = 10;
    if (x > maxRows) {
     }
    
  • Deklaracje Const muszą być zainicjowane

     const foo; // ERROR: const declarations must be initialized
    
  • const jest przestrzenią blokową tak jak widzieliśmy z let: +
const foo = 123;
if (true) {
    const foo = 456; // Allowed as its a new variable limited to this `if` block
}
 9
Author: Pardeep Jain,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-16 06:58:16

Podsumowanie:

ZARÓWNO let jak i const są sposobami deklarowania zmiennych o zasięgu bloku. Jest jednak jedna duża różnica:

  • zmienne zadeklarowane przez let można przypisać ponownie.
  • zmienne zadeklarowane przez const muszą być zainicjalizowane, gdy są zadeklarowane i nie mogą być ponownie przypisane.

Jeśli spróbujesz przypisać zmienne ze słowem kluczowym const, otrzymasz następujący błąd (chrome devtools):

błąd konstruowania

Dlaczego mamy tego używać?

Jeśli wiemy, że chcemy przypisać zmienną raz i że nie chcemy ponownie przypisać zmiennej, użycie słów kluczowych {[2] } oferuje następujące zalety:

  • komunikujemy się w naszym kodzie, że nie chcemy ponownie przypisać zmiennej. W ten sposób, jeśli inni programiści patrzą na Twój kod (lub nawet na twój własny kod, który napisałeś jakiś czas temu), wiesz, że zmienne deklarowane przez const nie powinny być przenoszone. W ten sposób nasz kod staje się bardziej deklaratywny i łatwiejszy do pracy.
  • wymuszamy zasadę braku możliwości przypisania zmiennej (silnik JS wyrzuca błąd). W ten sposób, jeśli przypadkowo spróbujesz przypisać zmienną, która nie ma być przypisana, możesz to wykryć na wcześniejszym etapie (ponieważ jest ona zalogowana do konsoli).

Zastrzeżenie:

Chociaż zmienna zadeklarowana przez const nie może być ponownie przypisana, nie oznacza to, że przypisany obiekt nie jest zmienny. Na przykład:

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);

Jeśli chcesz również, aby twój obiekt nie był zmienny, możesz użyć Object.freeze() w tym celu.

 5
Author: Willem van der Veen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-06 11:04:13

Let and const

Zmienne zadeklarowane przez let i const eliminują specyficzny problem podnoszenia, ponieważ są ograniczone do bloku, a nie do funkcji.

Jeśli zmienna jest zadeklarowana za pomocą let LUB const wewnątrz bloku kodu (oznaczonego nawiasami klamrowymi {}), to zmienna pozostaje w tzw. martwej strefie czasowej, dopóki deklaracja zmiennej nie zostanie przetworzona. To zachowanie zapobiega dostępowi do zmiennych dopiero po ich zadeklarowane.

Zasady korzystania z let i const

let i const mają również inne ciekawe właściwości.

  • zmienne zadeklarowane przez let mogą być ponownie przypisane, ale nie mogą być ponownie zgłoszony w tym samym zakresie.
  • zmienne zadeklarowane z const muszą mieć przypisaną wartość początkową, ale nie może być ponownie zgłoszony w tym samym zakresie i nie może być przeniesiony.

Przypadki użycia

Pytanie brzmi kiedy należy używać let i const? Ogólna zasada jest następująca:

  • użyj let, gdy planujesz przypisać nowe wartości do zmiennej i
  • użyj const, gdy nie planujesz przypisać nowych wartości do zmienna.

Ponieważ {[1] } jest najsurowszym sposobem deklarowania zmiennej, sugerujemy, aby zawsze deklarować zmienne za pomocą const, ponieważ ułatwi to rozumowanie Twojego kodu, ponieważ wiesz, że identyfikatory nie zmienią się przez cały okres życia Twojego programu. Jeśli znajdź, że musisz zaktualizować zmienną lub zmienić ją, a następnie wróć i przełącz ją z const na let.

 2
Author: Dhairya Lakhera,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-31 06:29:21

ES6 let i const

Nowy let pozwala zadeklarować zmienną, która jest ograniczona w zakresie do bloku (zmienna lokalna). Główną różnicą jest to, że zakres zmiennej var jest całką funkcji zamykającej:

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

console.log(foo); // 42

Użycie let w zakresie:

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

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

Użycie var w zakresie funkcji jest takie samo jak użycie let:

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

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

Słowo kluczowe let dołącza deklarację zmiennej do zakresu dowolnego bloku, w którym jest zawarta do środka.

Różnica Kolejności Deklaracji

Kolejną różnicą między let i var jest kolejność deklaracji / inicjalizacji. Dostęp do zmiennej zadeklarowanej przez let wcześniej niż jej deklaracja powoduje wywołanie ReferenceError .

console.log(a); // undefined
console.log(b); // ReferenceError: b is not defined

var a = 1;
let b = 2;

Za pomocą const

Z drugiej strony używanie ES6 const jest podobne do używania let, ale po przypisaniu wartości nie można jej zmienić. Użyj const jako niezmiennej wartości, aby zapobiec przypadkowo ponownie przypisany:

const num = 42;

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

}

num; // 42

Użyj const, aby przypisać zmienne, które są stałe w rzeczywistym życiu(np. temperatura zamarzania). JavaScript const nie polega na tworzeniu niezmiennych wartości, nie ma to nic wspólnego z wartością, const ma zapobiec ponownemu przypisaniu innej wartości do zmiennej i sprawić, że zmienna będzie tylko do odczytu. Jednak wartości mogą być zawsze zmieniane:

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

Aby zapobiec zmianie wartości, użyj Object.freeze():

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

arr; // [0, 1, 2]

Używanie let z For Pętla:

Szczególny przypadek, gdzie let jest naprawdę przydatny, znajduje się w nagłówku for pętli:

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

Można to również zastosować do innych pętli, takich jak for...in i for...of.

 1
Author: Shakespear,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-05-26 15:57:04
  • Deklaracje Var mają globalny zasięg lub zasięg funkcji, gdy let i const mają zasięg blokowy.

  • Zmienne Var mogą być aktualizowane i ponownie deklarowane w jego zakresie; niech zmienne mogą być aktualizowane, ale nie ponownie deklarowane; zmienne const nie mogą być aktualizowane ani ponownie deklarowane.

  • / Align = "left" / But while var zmienne są inicjalizowane zmiennymi undefined, let i const są nie zainicjowany.
  • While var I let mogą być zadeklarowane bez inicjalizacji, const musi być zainicjowany podczas deklaracji.

 1
Author: Medhat Mahmoud,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-08-02 19:32:11

Oto kilka notek, które zrobiłem, które pomogły mi w tym temacie. Również porównując const i let do var.

Oto 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 

Oto let i 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
 0
Author: Kean Amaral,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-19 12:21:25

Var

The var keyword was introduced with JavaScript. 
It has global scope.    
It can be declared globally and can be accessed globally.   
Variable declared with var keyword can be re-declared and updated in the same scope.
Example:
function varGreeter(){
  var a = 10;        
  var a = 20; //a is replaced
  console.log(a);
}
varGreeter();

Jest podniesiony.

Example:
{
  console.log(c); // undefined. 
  //Due to hoisting
  var c = 2;
}

Let

The let keyword was added in ES6 (ES 2015) version of JavaScript.
It is limited to block scope.
It can be declared globally but cannot be accessed globally.
Variable declared with let keyword can be updated but not re-declared.
Example:
function varGreeter(){
  let a = 10;        
 let a = 20; //SyntaxError: 
 //Identifier 'a' has already been declared
  console.log(a);
}
varGreeter();
Nie jest podnoszony.
Example:
{
  console.log(b); // ReferenceError: 
  //b is not defined
  let b = 3;
}

Global object property

  var no1 = "123";  // globally scoped
  let no2 = "789"; // globally scoped

  console.log(window.no1); // 123
  console.log(window.no2); // undefined

Redeklamacja:

'use strict';

  var name= "Keshav";
  var name= "Keshav Gera"; // No problem, 'name' is replaced.

  let surname= "Rahul Kumar";
  let surname= "Rahul Khan "; // SyntaxError: Identifier 'surname' has already been declared

Podnoszenie

function run() {
    console.log(name); // undefined
    var name= "Keshav";
    console.log(name); // Keshav
}

 run();

 function checkHoisting() {
     console.log(name); // ReferenceError
     let name= "Keshav";
     console.log(name); // Keshav
 }
 checkHoisting();

Notatka: W przypadku var otrzymasz undefined, w przypadku let otrzymasz błąd referencji

Const

It allows you to be immutable with variables.

Deklaracje Const muszą być zainicjowane

const name; // ERROR: const declarations must be initialized

A const is block scoped like we saw with let:+

const num = 10;
if (true) {
 const num = 20; // Allowed as its a new variable limited to this `if` block
}
 0
Author: Keshav Gera,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-07-04 06:34:39