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:
¿Cuál es la diferencia entre las claves de objeto con comillas y sin comillas?
Comentarios sobre esta answer
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 deIdentifierName
que no esReservedWord
(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 unIdentifier
.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.