Từ khóa Các biến được xác định bằng Các biến được xác định bằng Các biến được xác định bằng |
Không thể gán lại
Biến const
không thể được gán lại:
const PI = 3.141592653589793;
PI = 3.14; // This will give an error
PI = PI + 10; // This will also give an error
Phải được gán giá trị
Các biến const
trong JavaScript phải được gán một giá trị khi chúng được khai báo:
const PI = 3.14159265359;
Khi nào nên sử dụng const trong JavaScript? Luôn khai báo một biến bằng Sử dụng
|
Đối tượng và mảng không đổi
Từ khóa const
hơi gây hiểu nhầm.
Nó không xác định một giá trị không đổi. Nó định nghĩa một tham chiếu không đổi đến một giá trị.
Vì vậy bạn KHÔNG thể:
- Gán lại một giá trị không đổi
- Tái chỉ định một mảng không đổi
- Tái chỉ định một đối tượng không đổi
Nhưng bạn CÓ THỂ:
- Thay đổi các phần tử của mảng hằng
- Thay đổi thuộc tính của đối tượng không đổi
Mảng không đổi - Constant Arrays
Bạn có thể thay đổi các phần tử của một mảng không đổi:
// You can create a constant array:
const cars = ["Saab", "Volvo", "BMW"];
cars[0] = "Toyota"; // You can change an element
cars.push("Audi"); // You can add an element
Nhưng bạn KHÔNG thể gán lại mảng:
const cars = ["Saab", "Volvo", "BMW"];
cars = ["Toyota", "Volvo", "Audi"]; // ERROR
Đối tượng không đổi - Constant Objects
Bạn có thể thay đổi các thuộc tính của một đối tượng không đổi:
// You can create a const object:
const car = {type:"Fiat", model:"500", color:"white"};
car.color = "red"; // You can change a property
car.owner = "Johnson"; // You can change a property
Nhưng bạn KHÔNG thể gán lại đối tượng:
const car = {type:"Fiat", model:"500", color:"white"};
car = {type:"Volvo", model:"EX60", color:"red"}; // ERROR
Sự khác nhau giữa var, let, const
Phạm vi | Khai báo lại | Gán lại | Hoisted | Binds this | |
var | Không | Có | Có | Có | Có |
let | Có | Không | Có | Không | Không |
const | Có | Không | Không | Không | Không |
Ưu điểm
let
và const
có phạm vi khối.
let
và const
không thể được khai báo lại.
let
và const
phải được khai báo trước khi sử dụng.
let
và const
không liên kết với this.
let
và const
không được di chuyển lên đầu phạm vi trước khi chúng được thực thi.
Khuyết điểm
var
không cần phải khai báo.
var
được được di chuyển lên đầu phạm vi trước khi chúng được thực thi.
var
liên kết với this.
Trình duyệt hỗ trợ
Từ khóa let
và const
không được hỗ trợ trong Internet Explorer 11 trở về trước.
Bảng sau xác định các phiên bản trình duyệt đầu tiên được hỗ trợ đầy đủ:
Chrome 49 | Edge 12 | Firefox 36 | Safari 11 | Opera 36 |
Mar, 2016 | Jul, 2015 | Jan, 2015 | Sep, 2017 | Mar, 2016 |
Phạm vi khối - Block Scope
Khai báo một biến bằng const
cũng tương tự như let
khi nói đến phạm vi khối.
Trong ví dụ này, x được khai báo trong khối không giống với x được khai báo bên ngoài khối:
const x = 10;
// Here x is 10
{
const x = 2;
// Here x is 2
}
// Here x is 10
Bạn có thể tìm hiểu thêm về phạm vi khối trong bài JavaScript Scope.
Khai báo lại
Việc khai báo lại biến var
JavaScript được phép ở bất kỳ đâu trong chương trình:
var x = 2; // Allowed
var x = 3; // Allowed
x = 4; // Allowed
Không được phép khai báo lại một biến var
hoặc let
hiện có thành const
, trong cùng phạm vi:
var x = 2; // Allowed
const x = 2; // Not allowed
{
let x = 2; // Allowed
const x = 2; // Not allowed
}
{
const x = 2; // Allowed
const x = 2; // Not allowed
}
Không được phép gán lại một biến const
hiện có, trong cùng phạm vi:
const x = 2; // Allowed
x = 2; // Not allowed
var x = 2; // Not allowed
let x = 2; // Not allowed
const x = 2; // Not allowed
{
const x = 2; // Allowed
x = 2; // Not allowed
var x = 2; // Not allowed
let x = 2; // Not allowed
const x = 2; // Not allowed
}
Được phép khai báo lại một biến có const
, trong phạm vi khác hoặc trong khối khác:
const x = 2; // Allowed
{
const x = 3; // Allowed
}
{
const x = 4; // Allowed
}
Hoisting
Các biến được xác định bằng var
được đưa lên trên cùng và có thể được khởi tạo bất kỳ lúc nào.
Nghĩa là bạn có thể sử dụng biến trước khi nó được khai báo:
carName = "Volvo";
var carName;
Nếu bạn muốn tìm hiểu thêm về hoisting, hãy nghiên cứu bài JavaScript Hoisting.
Các biến được xác định bằng const
cũng được đưa lên đầu nhưng không được khởi tạo.
Vì vậy sử dụng biến const trước khi khai báo sẽ dẫn đến ReferenceError: