Por que "foo" .bar = 42; `lança` TypeError` no modo estrito no ES6?
De acordo com a especificação ES5.1, o programa"use strict;" "foo".bar = 42;
causa umString
objeto a ser criado, atribui uma propriedade a ele e depois joga o objeto fora, resultando em nenhum efeito observável - incluindo exceções. (A ausência de efeito pode ser confirmada tentando-o em uma implementação JS compatível com ES5 como a do Opera 12.)
Nas implementações modernas de JS, lança umTypeError
em vez disso, tente:
"use strict"; "foo".bar = 42;
Tenho certeza de que o novo comportamento é obrigatório pelas especificações do ES6, mas apesar de ler as seções relevantes várias vezes, não consigo ver onde está especificado queTypeError
ser jogado. De fato,as partes principais parecem inalterados:
6.2.3.2 PutValue (V, W) #
ReturnIfAbrupt (V)ReturnIfAbrupt (W)Se digite (V) não é referência, lance umReferenceError exceção.Deixeibase ser GetBase (V)Se IsUnresolvableReference (V) é verdade, então…Senão, se IsPropertyReference (V) é verdade, entãouma. Se HasPrimitiveBase (V) é verdade, entãoEu. Afirmar: Nesse caso,base nunca será nulo ou indefinido.ii. Conjuntobase ToObject (base)b. Deixeiconseguiu estar ?base. [[Set]] (GetReferencedName (V),W, GetThisValue (V)).c. ReturnIfAbrupt (conseguiu)d. E seconseguiu é false e IsStrictReference (V) é verdade, jogue umTypeError exceção.e Retorna.…Onde a especificação (ES6 ou mais recente) exige o lançamentoTypeError
?