JavaScript: var, let and const
I. Introduction
ECMAScript6 (abbr. ES6) is the second major revision to JavaScript and also known as ECMAScript2015. This is a JavaScript standard meant to ensure the interoperability of web pages across different web browsers.
ECMAScript is commonly used for client-side scripting on the World Wide Web, and it is increasingly being used for writing server applications and services using Node.js.
This update adds significant new syntax for writing complex applications, including:
- Class declarations (
class Foo{...}
), - ES6 modules (
import * as moduleName from "..."; export const Foo
), for..of
loops,- Python-style generator,
- Arrow function expression (
() => {...}
), - And
let
keyword for local declarations,const
keyword for constant local declarations, - ...
Browser Support for ES6 (2015)
Safari 10 and Edge 14 were the first browsers to fully support ES6:
II. What different between var
, let
, const
?
1 - Var
Scope: globally scoped or function/locally scoped
The scope is global when var
variable is declared outside a function. Any variable that is declared with var
outside a function block can be used in the whole window.
Within a function, var
is function scoped, this means that this variable is available and can be accessed only within that function.
Example:
var hello = "Hello from Shift Asia";
function sayHi() {
var hi = "Hi!";
}
console.log(hi); //error: hi is not defined
In this example, hello
is globally scoped while hi
is function scoped. So, if we try to use hi
, we'll get an error.
Re-declared and updated: var
can be re-declared and updated
This means that we can reassign these variables within the same scope and won't get any errors.
var hello = "Hello";
var hello = "Hello from Shift Asia";
hello = "Say hello once again";
Hoisting
This Javascript mechanism is tend to move all variables and function declarations to top of their scope before code execution. So, if we do as following:
console.log(hello);
var hello = "Say hello from Shift Asia";
Above block will be interpreted as:
var hello;
console.log(hello);
hello = "Say hello from Shift Asia";
This means, var
variables are hoisted to the top of their scope and initialized with a value of undefined
Problem with var
?
There's a weakness that comes with var
.
var hello = "Hi";
var times = 4;
if (times > 3) {
var hello = "say Hello from Shift Asia instead";
}
console.log(hello); // say Hello from Shift Asia instead
So, when times > 3
, hello
is redefined. Imagine if you have used hello
in other parts of your project, you might be surprised at the output, right ? This may cause a lot of bugs in your code. That's why let
and const
appear.
2 - Let
let
is now preferred for variable declaration. Let's consider why this is so.
Scope: let
is block scoped
Chunk of code bounded by {}
is called block. So a variable declared inside a block with let
is only accessible within that block.
Example:
let times = 4;
if (times > 3) {
let hello = "say Hello inside block";
console.log(hello); // say Hello inside block;
}
console.log(hello); // hello is undefined
Re-declared and updated: let
can be updated within its scope but cannot be re-declared within its scope.
So while this one will work fine:
let hello = "say hello";
hello = "updated say hello";
...but this one will return an error:
let hello = "say hello";
let hello = "updated say hello"; // error: Indentifer 'hello' has already been declared
However, in different scopes, it looks good:
let hello = "say Hi";
if (true) {
let hello = "say Hello inside condition block";
console.log(hello); // say Hello inside condition block
}
console.log(hello); // say Hi
So, when using let
instead of var
you don't need to bother if you have used this variable's name before outside, just need to care only within its scope.
Hoisting
Just like var
, let
declaration are hoisted to the top, but var
is initialized with undefined
, let
won't be initialized. So if you try to use a let
variable before declaration, you'll get a Reference Error
.
3 - Const
The const
keyword allows you to declare a constant (a JavaScript variable with a constant value). Constants are similar to let
variables, except that the value cannot be changed.
const hello = "say Hi";
hello = "Say Hello"; // error: Assignment to constant variable.
const hello = "say Hello instead"; // error: Identifier 'greeting' has already been declared
While a const
object cannot be updated, but the properties of this object can be updated.
const objectA = {
name: 'Object A',
value: 10
}
objectA = {
name: 'Object B',
value: 5
} // error: Assignment to constant variable
// But we can do this
objectA.name = 'Object B';
So just in case you need a summary, this is it:
Thank you for reading.