const vs let vs var
Written byPhuoc Nguyen
Created
18 Jun, 2020
Category
JavaScript
There are three keywords to declare a variable:
`var`
`let`
and`const`
which are only available in ES6
#Differences
-
It's not possible to access the
`let`
variable outside of the nearest enclosing block where it is declared.js{let foo;}// ReferenceError: foo is not definedconsole.log(foo);The sample code above works if we replace the`let`
with`var`
declaration. -
A
`let`
variable can't be used before it's declared. The sample code below throws a`ReferenceError`
:js{foo = 'hello';let foo;console.log(foo);}// ReferenceError: Cannot access 'foo' before initializationWe will see`hello`
in the Console if we use`var`
in the sample code above. -
It's not possible to re-declare variables with
`let`
.js// There is no problems if variables are re-declared with the same namevar foo, foo;var bar;var bar;let baz;let baz;// Throw the following error// SyntaxError: Identifier 'baz' has already been declared -
At the top level, global
`let`
variables aren't attached to the global`window`
object.jslet foo = 'hello';window.foo; // undefinedvar bar = 'world';window.bar; // 'world' -
Using
`let`
can avoid the problem with closures that`var`
has.To demonstrate the problem, let's assume that we have a list of rows. In each row, we have a button for removing the associate item in the row.We loop over the items, and handle the`click`
event of the button in each row:jsfor (var i = 0; i < 10; i++) {document.getElementById(`button-\${i}`).addEventListener('click', function () {// Remove the itemconsole.log(i);});}It doesn't work as we expect. We always see the last item index (`9`
in this case) in the Console when clicking any button. The variable`i`
in the closure of event handler will refer to the same object, which is the last index when looping over the indexes.The problem can be fixed by using`let`
:jsfor (let i = 0; i < 10; i++) {document.getElementById(`button-\${i}`).addEventListener('click', function () {// It's safe to use the index `i` hereconsole.log(i);});} -
The
`const`
keyword behaves same as`let`
, except the variable can't be changed.js// Throw the following error// SyntaxError: Missing initializer in const declarationconst a;You also have to specific a value for a constant.jsconst a = 'hello';// Throw the following error// TypeError: Assignment to constant variablea = 'world';It's worth noting that using`const`
doesn't mean that the variable is immutable. You can change the properties of an object:jsconst person = {};person.age = 20;And add more items to an array:jsconst arr = [];arr.push('foo');arr[1] = 'bar';console.log(arr); // ['foo', 'bar']
#Good practice
Don't use
`var`
unless you have to support old browsers which don't support `let`
and `const`
keywords.#Good to know
Each programming language use different keywords to declare a variable and constant.
The following table list out some examples:
Language | Variable declaration | Constant declaration |
---|---|---|
C# | `string s = "hello"` | `const string s = "hello"` |
Java | `String s = "hello"` | `final String s = "Hello"` |
Scala | `var s = "hello"` | `val s = "hello"` |
Swift | `var s = "hello"` | `let s = "hello"` |
Questions? 🙋
Do you have any questions about front-end development? If so, feel free to create a new issue on GitHub using the button below. I'm happy to help with any topic you'd like to learn more about, even beyond what's covered in this post.
While I have a long list of upcoming topics, I'm always eager to prioritize your questions and ideas for future content. Let's learn and grow together! Sharing knowledge is the best way to elevate ourselves 🥷.
Recent posts ⚡
Newsletter 🔔
If you're into front-end technologies and you want to see more of the content I'm creating, then you might want to consider subscribing to my newsletter.
By subscribing, you'll be the first to know about new articles, products, and exclusive promotions.
Don't worry, I won't spam you. And if you ever change your mind, you can unsubscribe at any time.
Phước Nguyễn