JavaScript Const
不能重新赋值
使用 const
关键字定义的变量不能被重新赋值
必须赋值
JavaScript const
变量必须在声明时赋值
正确
const PI = 3.14159265359;
不正确
const PI;
PI = 3.14159265359;
何时使用 JavaScript const?
当你知道值不应被更改时,始终使用 const
声明一个变量。
声明时使用 const
- 新的 Array
- 新的 Object
- 新的 Function
- 新的 RegExp
常量对象和数组
const
关键字有点误导。
它不定义一个常量值。它定义了一个指向值的常量引用。
因此,您不能
- 重新分配常量值
- 重新分配常量数组
- 重新分配常量对象
- 更改常量数组的元素
- 更改常量对象的属性
但是,您可以
常量数组
您可以更改常量数组的元素
示例
// 您可以创建一个常量数组
const cars = ["Saab", "Volvo", "BMW"];
// 您可以更改一个元素
cars[0] = "Toyota";
// 您可以添加一个元素
cars.push("Audi");
自己动手试一试 »
但是您不能重新分配数组
常量对象
您可以更改常量对象的属性
示例
// 您可以创建一个 const 对象
const car = {type:"Fiat", model:"500", color:"white"};
// 您可以更改一个属性
car.color = "red";
// 您可以添加一个属性
car.owner = "Johnson";
自己动手试一试 »
但是您不能重新分配对象
示例
const car = {type:"Fiat", model:"500", color:"white"};
car = {type:"Volvo", model:"EX60", color:"red"}; // 错误
自己动手试一试 »
var, let 和 const 之间的区别
作用域 | 重新声明 | 重新赋值 | 提升 (Hoisted) | 绑定 this | |
var | 否 | 是 | 是 | 是 | 是 |
let | 是 | 否 | 是 | 否 | 否 |
const | 是 | 否 | 否 | 否 | 否 |
什么好?
let
和 const
具有块级作用域。
let
和 const
不能被重新声明。
let
和 const
必须在使用前声明。
let
和 const
不会绑定到 this
。
let
和 const
不会提升。
什么不好?
var
不必声明。
var
会被提升。
var
绑定到 this。
浏览器支持
Internet Explorer 11 或更早版本不支持 let
和 const
关键字。
下表定义了首次完全支持的版本
Chrome 49 | Edge 12 | Firefox 36 | Safari 11 | Opera 36 |
2016 年 3 月 | 2015 年 7 月 | 2015 年 1 月 | 2017 年 9 月 | 2016 年 3 月 |
块作用域
使用 const
声明变量在块级作用域方面与 let
类似。
在此示例中,块内声明的 x 与块外声明的 x 不同
您可以在 JavaScript 作用域章节中了解更多关于块级作用域的知识。
重新声明
在程序中的任何位置都可以重新声明 JavaScript var
变量
示例
var x = 2; // 允许
var x = 3; // 允许
x = 4; // 允许
在同一作用域中,不允许将已存在的 var
或 let
变量重新声明为 const
示例
var x = 2; // 允许
const x = 2; // 不允许
{
let x = 2; // 允许
const x = 2; // 不允许
}
{
const x = 2; // 允许
const x = 2; // 不允许
}
在同一作用域中,不允许重新赋值已存在的 const
变量
示例
const x = 2; // 允许
x = 2; // 不允许
var x = 2; // 不允许
let x = 2; // 不允许
const x = 2; // 不允许
{
const x = 2; // 允许
x = 2; // 不允许
var x = 2; // 不允许
let x = 2; // 不允许
const x = 2; // 不允许
}
在另一个作用域或另一个块中,允许使用 const
重新声明变量
示例
const x = 2; // 允许
{
const x = 3; // 允许
}
{
const x = 4; // 允许
}
提升 (Hoisting)
使用 var
定义的变量会被提升到顶部,并可以随时初始化。
含义:您可以在声明变量之前使用它
如果您想了解更多关于提升的信息,请学习 JavaScript 提升章节。
使用 const
定义的变量也会被提升到顶部,但不会初始化。
含义:在声明之前使用 const
变量将导致 ReferenceError