JavaScript Const
ECMAScript 2015
ES2015 引入了两个重要的 JavaScript 新关键词:let 和 const。
通过 const 定义的变量与 let 变量类似,但不能重新赋值:
块作用域
在块作用域内使用 const 声明的变量与 let 变量相似。
在本例中,x 在块中声明,不同于在块之外声明的 x:
您可以在上一章 JavaScript Let 中学到更多有关块作用域的知识。
在声明时赋值
JavaScript const 变量必须在声明时赋值:
Incorrect
const PI;
PI = 3.14159265359;
Correct
const PI = 3.14159265359;
不是真正的常数
关键字 const 有一定的误导性。
它没有定义常量值。它定义了对值的常量引用。
因此,我们不能更改常量原始值,但我们可以更改常量对象的属性。
原始值
如果我们将一个原始值赋给常量,我们就不能改变原始值:
常量对象可以更改
您可以更改常量对象的属性:
实例
// 你可以创建一个 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"}; // ERROR
亲自试一试 »
常量数组可以更改
您可以更改常量数组的元素:
实例
// 您可以创建一个常量数组:
const cars = ["Saab", "Volvo", "BMW"];
// 你可以改变一个元素:
cars[0] = "Toyota";
// 您可以添加一个元素:
cars.push("Audi");
亲自试一试 »
但是您无法重新为常量数组赋值:
浏览器支持
Internet Explorer 10 或更早版本不支持 const 关键词。
下表定义了第一个完全支持 const 关键词的浏览器版本:
Chrome 49 | IE / Edge 11 | Firefox 36 | Safari 10 | Opera 36 |
Mar, 2016 | Oct, 2013 | Feb, 2015 | Sep, 2016 | Mar, 2016 |
重新声明
在程序中的任何位置都允许重新声明 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
变量重新声明声明或赋值是不允许的:
实例
const x = 2; // 允许
const x = 3; // 不允许
x = 3; // 不允许
var x = 3; // 不允许
let x = 3; // 不允许
{
const x = 2; // 允许
const x = 3; // 不允许
x = 3; // 不允许
var x = 3; // 不允许
let x = 3; // 不允许
}
在另外的作用域或块中重新声明 const 是允许的:
实例
const x = 2; // 允许
{
const x = 3; // 允许
}
{
const x = 4; // 允许
}
提升
通过 var 定义的变量会被提升到顶端。如果您不了解什么是提升(Hoisting),请学习 提升 这一章。
您可以在声明 var 变量之前就使用它:
通过 const 定义的变量不会被提升到顶端。
意思:代码块知道变量,但在声明之前不能使用它。
在声明 const 变量之前就使用它会导致 ReferenceError
.
变量从块的开头一直处于"暂时死区",直到声明为止: