发布于 2026-01-06 3 阅读
0

揭秘 JavaScript 中的“const”变量

揭秘 JavaScript 中的“const”变量

如今,ES6(ES2015)已​​经非常普及,许多开发者都使用这种现代语法编写 JavaScript 代码。然而,我经常发现变量声明方面还有改进的空间。具体来说,我经常看到let声明一个会被更新的对象,但却从未被重新赋值。

以下是引发问题的例子:

let cache = {};

cache.id = 'hello';

// We never reassign cache to a different value.
// It's a reference to the same object.
Enter fullscreen mode Exit fullscreen mode

是的,这确实可能是一个错误,const因为该cache变量从未被重新赋值。

不变性与重新分配

许多人将const声明变量称为创建“不可变”变量。不可变意味着变量的值(包括对象的属性)永远不能更新。

如果真是这样,那么让我们用 a 来尝试一下最初的例子const

const cache = {};

cache.id = 'hello';

console.log(cache.id); // will output "hello"
Enter fullscreen mode Exit fullscreen mode

如果cache现在是一个不可变、不可更改的常量,那么尝试id向其添加属性将不起作用,甚至会抛出错误。

但是,如果您尝试运行该示例,它将完全正常工作。字符串“hello”将被记录下来,该字符串是从更新后的对象中检索出来的。

好的,那么如果const没有声明某个变量是不可变的,它会做什么呢?嗯,不可变const变量会阻止变量被重新赋值

以下是一些重新赋值变量的示例:

let cache = {};

cache = { id: 'hello' }; // reassigning variable to a new object

let isSuccess = false;

isSuccess = true; // reassigning variable to false boolean
Enter fullscreen mode Exit fullscreen mode

将上述任何let语句更改为const其他语句都会抛出类型错误:“未捕获的类型错误:赋值给常量变量”。

设置对象的属性或更新现有属性并不等同于重新赋值。变量的值仍然是同一个对象,而你只是在更新该对象的属性。

使用的好处const

希望你现在明白const它们之间的let区别了,但这可能仍然引出一个主要问题:我为什么要关心并使用它const

这主要取决于代码质量,以及你或其他开发者能从中推断出多少信息。例如,当我查看代码库中的一个文件时,我看到了这样的内容:

let isSuccess = true;
Enter fullscreen mode Exit fullscreen mode

好的,这是一个用来声明某个操作是否成功的变量,在本例中,它的值为 true,表明操作成功true。但是,这let也告诉我,这个变量可以false在该文件的后续任何位置被重新赋值。

isSuccess为了再次确认,我在文件中搜索了所有出现的实例。嗯,它没有在任何地方被重新赋值,所以我知道这个变量的值将保持不变true

听起来像是一个常量,如果这个变量确实被声明为常量,const那么我就不必在文件的其他任何地方查找它了。

现在想象一下,几个月后你重新查看这段代码。在文件的底部,你添加了以下代码:

isSuccess = false;
Enter fullscreen mode Exit fullscreen mode

糟糕,你刚才可能造成了一个bug,因为你最初编写这段代码时,并没有预料isSuccesstrue以后会有人修改它。即使是未来的你自己

这种情况非常常见,尤其是在拥有多个开发人员的大型代码库中。好消息是,通过合理使用const`and` 函数可以轻松解决这个问题let

默认值const,但let必要时请使用

作为一条通用规则,我建议使用 `.`const来声明所有新变量,当需要重新赋值其中一个变量时,将其更改为 ` let.`

以下是一个更大的例子,说明如何正确使用这两种方法:

const cache = {};
let user = {};
let isSuccess = false;

// The `cache` variable is never reassigned a new value.
cache.greeting = `Hello`;

// The `user` variable is not reassigned a new value right now.
user.id = 1;

// Here, we assign `user` and `isSuccess` new values.
user = {};
isSuccess = true;
Enter fullscreen mode Exit fullscreen mode

const用`var` 而不是 ` varvar` 和 `var`来声明变量确实是一种范式转变let,但它可以增强代码的可靠性。试试看,然后告诉我你的想法。

想学习如何进一步提升代码质量吗?你或许会喜欢我的文章《为未来的自己编写代码》

文章来源:https://dev.to/sunnysingh/demystifying-const-variables-in-javascript-2jfo