What’s the Difference Between var, let, and const?

why people are using let and const if we’ve var. what makes them different from good ol’ var which we’ve been using? If you are still not clear about this, then this article is especially for you.

In this article, we’ll discuss the difference between var, let and const. But before starting we need to understand what scope is? As scope will be a key point in this article.

Scope

Scope essentially means where these variables are available for use. Scope determines the accessibility (visibility) of these variables.

var

All the variables which are declared using var are globally scoped or function/locally scoped. The scope is global when a var variable is declared outside a function. wait what does it mean. let’s see one example.


          var globalVar = "hey";

          function var() {
              var innerVariable = "hello";
          }

        

Here, globalVar is globally scoped because it exists outside a function while innerVariable is function scoped. So we can access globalVar inside function as well as outside of a function but we cannot access the variable innerVariable outside of a function.

So if we do this:


          var globalVar = "hey hi";
          
          function newFunction() {
              var innerVariable = "hello";
          }

          console.log(innerVariable); // error: innerVariable is not defined

        

var can be re-declared and updated.

What it means is you can re-initialize the variable using the same name with var and also you can update its value.


          var globalVar = "hey";
          var globalVar = "Hello";

          var innerVariable = "hey";
          innerVariable = "Hello";

        

What’s the problem with var


          var globalVar = "hey";
          var flag = true;

          if (flag) {
              var globalVar = "Hello";
          }

          console.log(globalVar) // "Hello"

        

So, since the flag returns true, globalVar is redefined to “Hello”. It becomes a problem when you want to update the variable’s value for that particular block. Here, globalVar will print “Hello” whenever you try to access it anywhere.

let

let solves the problem with var that we just covered. Let’s consider why this is so. let is block scoped. a variable declared in a block with let is only available for use within that block.


          if (flag) {
            var globalVar = "Hello";
            console.log(globalVar)
          }

          console.log(globalVar); // error: globalVar is not defined

        

We see that using globalVar outside its block returns an error. This is because let variables are block scoped.

let can be updated but not re-declared.

What it means is you can not re-initialize the variable using the same name with let and you can update its value.

If you try following then it will work for let.


          let globalVar = "Hi";

          globalVar = "Hello";

        

But if you try following then it will throw an error.


          let globalVar = "Hi";
          
          let globalVar = "Hello"; // Identifier 'globalVar' has already been declared

        

However, if you’ve defined the same variable is defined in different scopes then it will run perfectly without any error:


          let globalVar = "hey";
          let flag = true;

          if (flag) {
              let globalVar = "Hello";
              console.log(globalVar); // "Hello"
          }

          console.log(globalVar) // "hey"
          
          

const

Like let, const declarations also can only be accessed within the block they were declared. let’s see what’s the difference between let and const.

const cannot be updated or re-declared

What it means is you can not re-initialize the variable using the same name with const and also you can update its value.

If you try both of the following then both will throw an error for const.


          const globalVar = "Hi";

          globalVar = "Hello"; // error: Assignment to constant variable.

          const globalVar = "Hi";

          const globalVar = "Hello"; // Identifier 'globalVar' has already been declared
          
          

However, This behavior of const is somehow different when it comes to objects declared with const. You can not update a const object, But you can update the properties of these objects can be updated.


        const person = {
          name: "john",
          age: 4
        }

        You can not update above object like below.

        person = {
            name: "joe",
            gender: "male"
        } // error:  Assignment to constant variable.
        
        

But you can mutate an object declared with const like below.

          
          person.gender = "male";
        
        

This will add gender property in the person object with value male without returning errors.

Conclusion

It’s generally advisable and also good practice to avoid using var because of its function-scope. It absolutely appears to be that the aim of ES6 is to replace var with let/const since they will result in better coding practices.