TypeError: "x" 是只读的
JavaScript 严格模式专属异常“是只读的”发生在全局变量或已赋值的对象属性是只读属性时。
消息
TypeError: Cannot assign to read only property 'x' of #<Object> (V8-based) TypeError: "x" is read-only (Firefox) TypeError: Attempted to assign to readonly property. (Safari)
错误类型
哪里出错了?
已赋值的全局变量或对象属性是只读属性。(从技术上讲,它是 不可写的 data 属性。)
此错误仅在 严格模式代码 中发生。在非严格模式代码中,赋值会被静默忽略。
示例
无效情况
只读属性并不常见,但可以使用 Object.defineProperty()
或 Object.freeze()
创建。
js
"use strict";
const obj = Object.freeze({ name: "Elsa", score: 157 });
obj.score = 0; // TypeError
("use strict");
Object.defineProperty(this, "LUNG_COUNT", { value: 2, writable: false });
LUNG_COUNT = 3; // TypeError
("use strict");
const frozenArray = Object.freeze([0, 1, 2]);
frozenArray[0]++; // TypeError
JavaScript 中还有一些内置的只读属性。也许您尝试重新定义数学常量。
js
"use strict";
Math.PI = 4; // TypeError
抱歉,您不能这样做。
全局变量undefined
也是只读的,因此您不能通过以下方式消除臭名昭著的“undefined is not a function”错误
js
"use strict";
undefined = function () {}; // TypeError: "undefined" is read-only
有效情况
js
"use strict";
let obj = Object.freeze({ name: "Score", points: 157 });
obj = { name: obj.name, points: 0 }; // replacing it with a new object works