JavaScript - 常量
JavaScript 常量是指在程序执行过程中其值保持不变的变量。您可以使用 const 关键字声明常量。
JavaScript const 关键字
在 JavaScript ES6 版本中,let 关键字引入了 const 关键字。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 变量 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 |
|---|---|---|---|
| Scope | Function | Block | Block |
| Hoisted | Yes | No | No |
| Reassign | Yes | Yes | No |
| Re-declare | Yes | No | No |
| Bind This | Yes | No | No |
var、let 和 const 中应该使用哪个?
- 对于块作用域,应该使用 let 关键字。
- 如果需要将常量引用赋值给任何值,请使用 const 关键字。
- 当需要在任何特定块(例如循环、if 语句等)内定义变量,并且需要在块外部但在函数内部访问时,可以使用 var 关键字。
- 但是,可以使用任何关键字来定义全局变量。
- 重复声明变量不是一个好习惯。因此,应该避免这样做,但如果有必要,可以使用 var 关键字。

