I'm wondering what is the difference between let
and const
in ES6. Both of them are block scoped, as the example in the following code:
const PI = 3.14; console.log(PI); PI = 3; console.log(PI); const PI = 4; console.log(PI); var PI = 5; console.log(PI);
In ES5 the output will be:
3.14 3.14 3.14 3.14
But in ES6 it will be:
3.14 3 4 5
I'm wondering why ES6 allows the change of const
value, the question is why should we use 'const' now? we can use 'let' instead?
Note: jsbin can be used for testing, choose JavaScript to run ES5 code and Traceur to run it with ES6 capabilities.
`const` is a signal that the identifier won't be reassigned. `let` is a signal that the variable may be reassigned, such as a counter in a loop, or a value swap in an algorithm. It also signals that the variable will be used only in the block it's defined in, which is not always the entire containing function.
let allows you to declare variables that are limited to the scope of a block statement, or expression on which it is used, unlike the var keyword, which declares a variable globally, or locally to an entire function regardless of block scope.
Introduction to the JavaScript const keyword ES6 provides a new way of declaring a constant by using the const keyword. The const keyword creates a read-only reference to a value. const CONSTANT_NAME = value; Code language: JavaScript (javascript) By convention, the constant identifiers are in uppercase.
The difference between let
and const
is that once you bind a value/object to a variable using const
, you can't reassign to that variable. In other words Example:
const something = {}; something = 10; // Error. let somethingElse = {}; somethingElse = 1000; // This is fine.
The question details claim that this is a change from ES5 — this is actually a misunderstanding. Using const
in a browser that only supports ECMAScript 5 will always throw an error. The const
statement did not exist in ECMAScript 5. The behaviour in is either JS Bin being misleading as to what type of JavaScript is being run, or it’s a browser bug.
In practice, browsers didn't just go from 0% support for ECMAScript 2015 (ECMAScript 6) to 100% in one go — features are added bit-by-bit until the browser is fully compliant. What JS Bin calls ‘JavaScript’ just means whatever ECMAScript features your browser currently supports — it doesn’t mean ‘ES5’ or ‘ES6’ or anything else. Many browsers supported const
and let
before they fully supported ES6, but some (like Firefox) treated const
like let
for some time. It is likely that the question asker’s browser supported let
and const
but did not implement them correctly.
Secondly, tools like Babel and Traceur do not make ES6 ‘run’ in an older browser — they instead turn ES6 code into ES5 that does approximately the same thing. Traceur is likely turning const
statements into var
statements, but I doubt it is always enforcing that the semantics of a const
statement are exactly replicated in ES5. Using JS Bin to run ES6 using Traceur is not going to give exactly the same results as running ES6 in a fully ES6 specification-compliant browser.
It is important to note that const
does not make a value or object immutable.
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.
Probably the best way to make an object (shallowly) immutable at the moment is to use Object.freeze()
on it. However, this only makes the object itself read-only; the values of the object’s properties can still be mutated.
What you're seeing is just an implementation mistake. According to the ES6 spec wiki on const
, const
is:
A initialize-once, read-only thereafter binding form is useful and has precedent in existing implementations, in the form of const declarations.
It's meant to be read-only, just like it currently is. The ES6 implementation of const
in Traceur and Continuum are buggy (they probably just overlooked it)
Here's a Github issue regarding Traceur not implementing const
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With