--- title: 'TypeError: "x" is read-only' slug: Web/JavaScript/Reference/Errors/Read-only tags: - Erros - JavaScript - TypeError translation_of: Web/JavaScript/Reference/Errors/Read-only ---
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)
{{jsxref("TypeError")}}
A variável global ou propriedade do objeto foi definida como propriedade somente-leitura. (Tecnicamente, esse é um dado de não-escrita.)
Esse erro ocorre apenas em código no strict mode. No modo não strict mode, essa atribuição é ignorada silenciosamente.
Propriedades somente-leitura não são super comuns, mas elas podem ser criadas utilizando {{jsxref("Object.defineProperty()")}} ou {{jsxref("Object.freeze()")}}.
'use strict'; var obj = Object.freeze({nome: 'Elsa', pontuacao: 157}); obj.pontuacao = 0; // TypeError 'use strict'; Object.defineProperty(this, 'CONTADOR_PULMAO', {value: 2, writable: false}); CONTADOR_PULMAO = 3; // TypeError 'use strict'; var frozenArray = Object.freeze([0, 1, 2]); frozenArray[0]++; // TypeError
Existem também algumas propriedades somente-leitura nativas do Javascript. Talvez você já tentou redefinir um constante matemática.
'use strict'; Math.PI = 4; // TypeError
Desculpe, você não pode fazer isso.
A variável global undefined
também é somente-leitura, então você não pode silenciar o infame erro "undefined is not a function" fazendo isso:
'use strict'; undefined = function() {}; // TypeError: "undefined" is read-only
'use strict'; var obj = Object.freeze({nome: 'Score', pontos: 157}); obj = {nome: obj.nome, pontos: 0}; // substituindo com o novo objeto funciona 'use strict'; var CONTADOR_PULMAO = 2; // uma `var` funciona, porque ela não é somente-leitura CONTADOR_PULMAO = 3; // ok (anatomicamente improvável, porém...)