La palabra clave const se introdujo en ES6 (2015). Las variables definidas con const no se pueden volver a declarar. Las variables definidas con const no se pueden reasignar. Las variables definidas con const tienen ámbito de bloque.

Deben ser asignadas

A las variables const de JavaScript se les debe asignar un valor cuando se declaran.

Correcto

const PI = 3.14159265359;

Incorrecto

const PI;
PI = 3.14159265359;

Cuando usar const

Como regla general, siempre declara una variable con const a menos que sepas que el valor cambiará. Usa const cuando declaras:

  • Un nuevo Array
  • Un nuevo Object
  • Una nueva función
  • Un nuevo RegExp

Objetos constantes y matrices

La palabra clave const es un poco engañosa. No define un valor constante. Define una referencia constante a un valor. Por eso NO puedes:

  • Reasignar un valor constante
  • Reasignar un Array constante
  • Reasignar un Objeto constante

Pero sí que puedes:

  • Cambiar los elementos de un Array constante
  • Cambiar las propiedades de un Object (objeto) constante

Arrays constantes

Puedes cambiar los elementos de un Array constante.

Ejm

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Ejm14</title>
</head>
<body>
    <h1>Constantes en Javascript</h1>
    <p>Declarar una matriz constante no hace que los elementos no se puedan cambiar</p>
    <p id="demo"></p>
    <script>
        // CREAR UN ARRAY
        const cars = ["Saab", "Volvo", "Audi"];

        // CAMBIO UN ELEMENTO
        cars[0] = "Vw";

        //AÑADIR UN ELEMENTO
        cars.push("Renault");

        // MOSTRAR EL ARRAY
        document.getElementById("demo").innerHTML = cars;
    </script>
</body>
</html>

Pero NO puedes reasignar la matriz:

const cars = ["Saab""Volvo""BMW"];
cars = ["Toyota""Volvo""Audi"];    // ERROR

Objetos constantes

Puedes cambiar las propiedades de un objeto contante.

Ejm

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Ejm15</title>
</head>
<body>
    <h1>Ejm15 - Objeto Constante</h1>
    <p>Declarar un objeto constante NO hace que las propiedades de los objetos no se puedan modificar</p>
    <p id="demo"></p>
    <script>
        // CREAR UN OBJETO
        const car = {type: "Fiat", model: "500", color: "blanco"};

        // CAMBIAR UNA PROPIEDAD
        car.color = "rojo";

        // AÑADIR UNA PROPIEDAD
        car.cliente = "Francisco";

        // MOSTRAR EL OBJETO
        document.getElementById("demo").innerHTML = "El dueño del coche es " + car.cliente;
    </script>
</body>
</html>

Lo que no puedes es reasignar el objeto:

const car = {type:"Fiat", model:"500", color:"blanco"};
car = {type:"Volvo", model:"EX60", color:"rojo"};    // ERROR

Alcance de bloque

Declarar una variable con const es similar a let cuando se trata de alcance de bloque. La x declarada en el bloque, en este ejemplo, no es la misma que la x declarada fuera del bloque,

Ejm

const x = 10;
// Here x is 10

{
const x = 2;
// Here x is 2
}

// Here x is 10

Redeclarando

Se permite volver a declarar una variable var de JavaScript en cualquier parte de un programa.

Ejm

var x = 2;     // PERMITIDO
var x = 3;     // PERMITIDO
x = 4;         // PERMITIDO

No se permite volver a declarar una variable var o let existente a const, en el mismo ámbito.

Ejm

var x = 2;     // PERMITIDO
const x = 2;   // NO PERMITIDO

{
let x = 2;     // PERMITIDO
const x = 2;   // NO PERMITIDO
}

{
const x = 2;   // PERMITIDO
const x = 2;   // NO PERMITIDO
}

No se permite reasignar una variable const existente, en el mismo ámbito.

Ejm

const x = 2;     // PERMITIDO
x = 2;           // NO PERMITIDO
var x = 2;       // NO PERMITIDO
let x = 2;       // NO PERMITIDO
const x = 2;     // NO PERMITIDO

{
  const x = 2;   // PERMITIDO
  x = 2;         // NO PERMITIDO
  var x = 2;     // NO PERMITIDO
  let x = 2;     // NO PERMITIDO
  const x = 2;   // NO PERMITIDO
}

Se permite redeclarar una variable con const, en otro ámbito, o en otro bloque.

Ejm

const x = 2;       // Allowed

{
  const x = 3;   // Allowed
}

{
  const x = 4;   // Allowed
}

Las variables definidas con var se elevan a la parte superior y se pueden inicializar en cualquier momento, es decir, se puede usar la variable antes de que se declare.

Ejm correcto

carName = "Volvo";
var carName;