ultima tutorial es6 ecs6 ecmascript javascript language-lawyer ecmascript-5

tutorial - ¿Es necesario citar las palabras reservadas cuando se configuran como nombres de propiedades de objetos de JavaScript?



es6 javascript tutorial (3)

Dado un objeto literal, o jQuery (html, atributos), ¿alguna especificación indica que las palabras reservadas o las futuras palabras reservadas DEBEN ser citadas?

No (comenzando con ES5).

La definición de propiedad en la especificación es que es cualquier nombre de identificador. class es un nombre de identificador perfectamente bueno.

Como otros han señalado en los comentarios, de acuerdo con la especificación, el nombre de la propiedad en un objeto literal puede ser un nombre de identificador (sin comillas) (además de ser una cadena, etc.). IdentifierName es, para todos los propósitos prácticos, cualquier secuencia de "letras" Unicode, como se indica en la sección 7.6 .

Tenga en cuenta que el error de sintaxis generado por

const {class} = obj;

No es una excepción. Eso no es un objeto literal, que es de lo que trata la pregunta; es una asignación (o el tipo de desestructuración), que intenta asignar una class variable . Por supuesto, usted no puede, nunca ha podido y nunca podrá tener variables que se nombran con palabras reservadas.

Vea también esta publicación del blog , que aunque no es autoritaria es una fuente de información confiable y de alta calidad sobre todas las cosas ES5 / 6/7.

Tenga en cuenta que en ES3, la definición de PropertyName era Identifier , no IdentifierName como en ES5. Eso impidió el uso de propiedades como la class , ya que la class no es un identificador. Fue este cambio el que permitió el uso de palabras reservadas sin comillas como propiedades en literales de objetos (así como en notación de puntos).

Con respecto a los "objetos jQuery", un "objeto jQuery" es simplemente un objeto JS antiguo normal. ¿Te refieres a los elementos DOM mantenidos por objetos jQuery? Son una especie de híbrido de objetos nativos y objetos JS. Como objetos JS, pueden tener propiedades. Sin embargo, no se pueden escribir en forma literal de objeto, por lo que la pregunta no se aplica realmente a ellos. (Como objetos nativos (DOM), pueden tener atributos, este último caso no está cubierto por la especificación JS).

Dado un objeto literal, o jQuery(html, attributes) , ¿alguna especificación indica que las palabras reservadas o las futuras palabras reservadas DEBEN ser citadas?

O, por ejemplo, ¿se puede establecer la class como un nombre de propiedad de un objeto sin usar comillas para rodear el nombre de la propiedad, sin que la práctica sea contraria a una especificación sobre identificadores, nombres de propiedad o el uso de palabras reservadas?

Buscando una respuesta concluyente sobre esta pregunta para evitar confusiones.

let objLit = { class: 123, var: "abc", let: 456, const: "def", import: 789 } console.dir(objLit); jQuery("<div>012</div>", { class: "ghi" }) .appendTo("body");

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"> </script>

Relacionado:

Especificación

Los nombres de identificadores son tokens que se interpretan de acuerdo con la gramática que se proporciona en la sección "Identificadores" del capítulo 5 del estándar de Unicode , con algunas pequeñas modificaciones .
Un identificador es un nombre de identificador que no es ReservedWord


Esta respuesta no puede competir con las que ya se han dado, pero me encantaría añadirlas.

En mi código prefiero SIEMPRE citar claves, por ejemplo:

var o; o = { "label": "Hello", "index": 3 };

De esta manera, el problema de nombres extraños o palabras clave reservadas ni siquiera surge. Además, todos los literales de objetos están escritos en un estilo que está muy cerca de JSON válido, ya que se puede hacer una copia extra + pegar en un archivo JSON separado (y viceversa) muy rápidamente.

Hoy en día, considero que este es un estilo imprescindible para el código limpio.


ECMAScript 5+

No, no se necesitaron citas desde ECMAScript 5. He aquí por qué:

Como se mencionó en su publicación, de la especificación de lenguaje ECMAScript® 5.1 :

7.6 Nombres de identificadores e identificadores

Los nombres de identificadores son tokens que se interpretan de acuerdo con la gramática que se proporciona en la sección "Identificadores" del capítulo 5 del estándar de Unicode, con algunas pequeñas modificaciones. Un Identifier es un nombre de IdentifierName que no es ReservedWord (ver 7.6.1 ).

[...]

Sintaxis

Identifier :: IdentifierName but not ReservedWord

Por especificación, un ReservedWord es:

7.6.1 Palabras reservadas

Una palabra reservada es un nombre de IdentifierName que no se puede utilizar como un Identifier .

Sintaxis

ReservedWord :: Keyword FutureReservedWord NullLiteral BooleanLiteral

Esto incluye palabras clave, palabras clave futuras, null y literales booleanos. La lista completa es la siguiente:

7.6.1.1 Palabras clave

break do instanceof typeof case else new var catch finally return void continue for switch while debugger function this with default if throw delete in try

7.6.1.2 Futuras palabras reservadas

class enum extends super const export import

7.8.1 Literales nulos

null

7.8.2 Literales booleanos

true false

Lo anterior (Sección 7.6) implica que IdentifierName s puede ser ReservedWord s, y de la especificación para inicializadores de objetos :

11.1.5 Inicializador de objetos

[...]

Sintaxis

ObjectLiteral : { } { PropertyNameAndValueList } { PropertyNameAndValueList , }

Donde PropertyName es, por especificación:

PropertyName : IdentifierName StringLiteral NumericLiteral

Como puede ver, un PropertyName puede ser un IdentifierName , permitiendo así que ReservedWord s sea PropertyName s. Eso nos dice de manera concluyente que, por especificación , se permite tener ReservedWord s como class y var como PropertyName s sin comillas, como literales de cadena o literales numéricos.

ECMAScript <5

Para profundizar en el por qué esto no estaba permitido en versiones anteriores a ES5, debe ver cómo se definió PropertyName . Según la especificación de idioma de ECMAScript® 3 :

PropertyName : Identifier StringLiteral NumericLiteral

Como puede ver, PropertyName era un Identifer , no un IdentifierName , lo que lleva a la incapacidad de ReservedWord s como PropertyName s.