javascript - attribute - title html




nombre de la propiedad abreviada con*esto* (2)

El siguiente código falla

let x = {this}

¿Por qué no puedo usar el nombre abreviado de la propiedad con esto ?

mensajes de error de los navegadores

Chrome 66.0.3359.117: Untaught SyntaxError: Token inesperado}

Firefox 59.0.1: este es un identificador no válido

edge 41.16299.371.0: el uso de una palabra clave para un identificador no es válido

No entiendo lo que dicen estos mensajes.

Solo para que quede claro, el siguiente código funciona bien.

let x = 5
let y = {x}
let z = {this:this}

console.log({x,y,z})


Según la especificación ECMA (he puesto en negrita lo que es importante):

12.2.6 Inicializador de objetos

NOTE 1 An object initializer is an expression describing the initialization of an Object, written in a form resembling a literal. It is a list of zero or more pairs of property keys and associated values, enclosed in curly brackets. The values need not be literals; they are evaluated each time the object initializer is evaluated.

Sintaxis

  • ObjectLiteral [rendimiento]:
    • {}
    • {PropertyDefinitionList [? Rendimiento]}
    • {PropertyDefinitionList [? Rendimiento],}
  • PropertyDefinitionList [Rendimiento]:
    • PropiedadDefinición [? Rendimiento]
    • PropertyDefinitionList [? Yield], PropertyDefinition [? Yield]
  • PropertyDefinition [rendimiento]:
    • IdentifierReference [? Rendimiento]
    • CoverInitializedName [? Yield]
    • PropertyName [? Yield]: AssignmentExpression [In,? Yield]
    • MethodDefinition [? Rendimiento]
  • PropertyName [rendimiento]:
    • LiteralPropertyName
    • ComputedPropertyName [? Rendimiento]
  • LiteralPropertyName:
    • Nombre de identificador
    • StringLiteral
    • NuméricoLiteral
  • ComputedPropertyName [rendimiento]: - [AssignmentExpression [en,? Rendimiento]]
    • CoverInitializedName [rendimiento]:
    • IdentifierReference [? Yield] Initializer [In,? Yield]
  • Inicializador [en, rendimiento]:
    • = AssignmentExpression [? In,? Yield]

NOTE 2 MethodDefinition is defined in 14.3.

NOTE 3 In certain contexts, ObjectLiteral is used as a cover grammar for a more restricted secondary grammar. The CoverInitializedName production is necessary to fully cover these secondary grammars. However, use of this production results in an early Syntax Error in normal contexts where an actual ObjectLiteral is expected.

12.1 identificadores

Sintaxis

  • IdentifierReference [rendimiento]:
    • Identificador
    • Rendimiento de [~ rendimiento]
  • BindingIdentifier [rendimiento]:
    • Identificador
    • Rendimiento de [~ rendimiento]
  • LabelIdentifier [rendimiento]:
    • Identificador
    • Rendimiento de [~ rendimiento]
  • Identificador:
    • Nombre de identificador pero no ReservedWord

Lo que esto significa es que en la taquigrafía let x = { Identificador } no permite palabras reservadas como Identificador . Y this es una palabra reservada, mire 11.6.2 Palabras reservadas y adelante. Por otro lado vemos que la forma expandida de escribirlo es diferente:
let x = { PropertyName : AssignmentExpression } donde PropertName es ComputedPropertyName o LiteralPropertyName que es IdentifierName que no excluye las palabras reservadas. Por lo tanto, let x = {this: this} o let x = {class: 10} no sea un problema. Sin embargo, no explica por qué esto es así, ¿tal vez complicaría la gramática o la haría ambigua?


this en Javascript es una palabra clave (no una variable), por lo tanto no tiene nombre.

En el caso de { x } , x tiene un nombre, "x", y su valor.

Pero { this } , this no tiene nombre. this solo representa un valor apropiado cuando se interpreta un código.





language-lawyer