TypeError: 对 const "x" 的无效赋值

当试图更改常量值时,JavaScript 异常“对 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)

错误类型

哪里出错了?

常量是一个在程序正常执行期间不能被程序更改的值。它不能通过重新赋值来更改,也不能重新声明。在 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" }

另请参阅