JavaScript - 常量
JavaScript 常量 是指在程序执行过程中值保持不变的变量。您可以使用 const 关键字声明常量。
JavaScript const 关键字
const 关键字与 let 关键字一起在 JavaScript 的 ES6 版本中引入。const 关键字用于定义具有 常量引用 的变量。
使用 const 定义的变量不能被 重新声明 或 重新赋值。const 声明具有块级作用域和函数作用域。
声明 JavaScript 常量
如果使用 const 关键字声明变量,则必须在声明时为其赋值。
const x = 10; // 正确方式
在任何情况下,都不能在不初始化值的情况下使用 const 关键字声明变量。
const y; // 错误方式 y = 20;
不能被重新赋值
您不能更新使用 const 关键字声明的变量的值。
const y = 20; y = 40; // 这不可能
块级作用域
使用 const 关键字声明的 JavaScript 变量具有块级作用域。这意味着在块外部,同一个变量被视为不同的变量。
在下面的示例中,块内部声明的 x 与块外部声明的 x 是不同的。因此,我们可以在块外部 重新声明 同一个变量。
{
const x = "john";
}
const x = "Doe"
但是,我们不能在同一个块内部 重新声明 const 变量。
{
const x = "john";
const x = "Doe" // 错误
}
JavaScript 中的常量数组和对象
我们可以使用 const 关键字声明数组和对象,但在数组和对象的声明中有一个小小的不同点。
使用 const 关键字的变量保持常量引用,但不是常量值。因此,您可以更新使用 const 关键字声明的同一数组或对象,但不能将新数组或对象的引用重新赋值给常量变量。
示例(常量数组)
在下面的示例中,我们使用 const 关键字定义了名为 'arr' 的数组。之后,我们更新了数组第 0 个索引处的元素,并在数组末尾插入 'fence' 字符串。
在输出中,您可以观察到它打印了更新后的数组。
<html>
<head>
<title> Constant Arrays </title>
</head>
<body>
<script>
// 定义常量数组
const arr = ["door", "window", "roof", "wall"];
// 更新 arr[0]
arr[0] = "gate";
// 向数组插入元素
arr.push("fence");
//arr = ["table", "chair"] // 重新赋值数组会导致错误。
// 打印数组
document.write(arr);
</script>
</body>
</html>
执行上述代码将产生以下结果 −
gate,window,roof,wall,fence
示例(常量对象)
在下面的示例中,我们使用 const 关键字创建了 'obj' 对象。接下来,我们更新了对象的 'animal' 属性,并在对象中插入 'legs' 属性。在输出中,代码打印了更新后的对象。
<html>
<head>
<title> Constant Objects </title>
</head>
<body>
<script>
// 定义常量对象
const obj = {
animal: "Lion",
color: "Yellow",
};
// 更改动物名称
obj.animal = "Tiger";
// 插入 legs 属性
obj.legs = 4;
// 打印对象
document.write(JSON.stringify(obj));
// obj = { name: "cow" } // 这不可能
</script>
</body>
</html>
它将产生以下结果 −
{"animal":"Tiger","color":"Yellow","legs":4}
因此,我们不能更改使用 const 关键字声明的变量(数组和对象)的引用,但可以更新元素和属性。
const 不存在提升
使用 const 关键字定义的变量不会被提升到代码顶部。
在下面的示例中,在定义 const 变量 x 之前就访问了它。这会导致错误。我们可以使用 try-catch 语句捕获该错误。
<html>
<body>
<script>
document.write(x);
const x = 10;
</script>
</body>
</html>
以下是使用 const 关键字声明变量的一些其他特性。
- 块级作用域。
- 在同一作用域内不能被重新声明。
- 使用 const 关键字声明的变量不会被提升到代码顶部。
- 常量变量的值是原始值。
var、let 和 const 之间的区别
我们提供了使用 var、let 和 const 关键字声明变量的比较表。
| 比较依据 | var | let | const |
|---|---|---|---|
| 作用域 | 函数作用域 | 块级作用域 | 块级作用域 |
| 提升 | 是 | 否 | 否 |
| 重新赋值 | 是 | 是 | 否 |
| 重新声明 | 是 | 否 | 否 |
| 绑定 this | 是 | 否 | 否 |
var、let 和 const 中应该使用哪一个?
- 对于块级作用域,应该使用 let 关键字。
- 如果需要为任何值分配常量引用,使用 const 关键字。
- 当需要在特定块(如循环、if 语句等)内定义变量,并在块外但函数内访问时,可以使用 var 关键字。
- 不过,你可以使用任何关键字来定义全局变量。
- 重新声明变量不是一个好习惯。所以应该避免这样做,但如果必要,可以使用 var 关键字。