{{jsSidebar("Errors")}}
Message
TypeError: "x" is read-only (Firefox) TypeError: 0 is read-only (Firefox) TypeError: Cannot assign to read only property 'x' of #<object> (Chrome) TypeError: Cannot assign to read only property '0' of [object Array] (Chrome)Error type
{{jsxref("TypeError")}}
What went wrong?
The global variable or object property you're assigning to is a read-only property.
Read-only properties are not super common, but they can be created using {{jsxref("Object.defineProperty()")}} or {{jsxref("Object.freeze()")}}.
This error happens only in strict mode code. In non-strict code, the assignment is silently ignored.
Examples
Invalid cases
"use strict"; var 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"; var frozenArray = Object.freeze([0, 1, 2]); frozenArray[0]++; // TypeErrorThe global variable
undefined
is also read-only, so you can't silence the infamous "undefined is not a function" error by doing this:"use strict"; undefined = function () {}; // TypeError: "undefined" is read-onlyValid cases
"use strict"; var obj = Object.freeze({name: "Score", points: 157}); obj = {name: obj.name, points: 0}; // replacing it with a new object works "use strict"; var LUNG_COUNT = 2; // a `var` works, because it's not read-only LUNG_COUNT = 3; // ok (anatomically unlikely, though)See also
- {{jsxref("Object.defineProperty()")}}
- {{jsxref("Object.freeze()")}}