TypeError: invalid assignment to const "x"

JavaScript 异常 "invalid assignment to const" 发生在你尝试修改一个常量值时。JavaScript const 声明不能被重新赋值或重新声明。

消息

TypeError: Assignment to constant variable. (V8-based)
TypeError: invalid assignment to const 'x' (Firefox)
TypeError: Attempted to assign to readonly property. (Safari)

错误类型

TypeError

哪里出错了?

常量是一个在正常执行期间程序不能更改的值。它不能通过重新赋值来更改,也不能重新声明。在 JavaScript 中,常量使用 const 关键字声明。

示例

无效的重新声明

在同一块作用域内为相同的常量名赋值会抛出错误。

js
const COLUMNS = 80;

// …

COLUMNS = 120; // TypeError: invalid assignment to const `COLUMNS'

修复错误

有多种方法可以修复此错误。检查你想要使用该常量实现什么。

重命名

如果你打算声明另一个常量,请选择另一个名称并重命名。此常量名已在此作用域中被占用。

js
const COLUMNS = 80;
const WIDE_COLUMNS = 120;

const、let 还是 var?

如果你不打算声明一个常量,请不要使用 const。也许你打算使用 let 声明一个块作用域变量,或使用 var 声明一个全局变量。

js
let columns = 80;

// …

columns = 120;

作用域

检查你是否处于正确的范围。这个常量应该出现在这个范围中,还是它应该出现在一个函数中,例如?

js
const COLUMNS = 80;

function setupBigScreenEnvironment() {
  const COLUMNS = 120;
}

const 和不变性

const 声明创建了对值的只读引用。它意味着它持有的值是不可变的,只是变量标识符不能被重新赋值。例如,如果内容是一个对象,这意味着对象本身仍然可以被修改。这意味着你不能改变存储在变量中的值

js
const obj = { foo: "bar" };
obj = { foo: "baz" }; // TypeError: invalid assignment to const `obj'

但你可以改变变量中的属性

js
obj.foo = "baz";
obj; // { foo: "baz" }

另见