ejemplos ejemplo color attribute javascript json

javascript - ejemplo - title css



en JSON, ¿por qué se cita cada nombre? (7)

La especificación JSON dice que JSON es un objeto o una matriz. En el caso de un objeto,

Una estructura de objeto se representa como un par de llaves que rodean cero o más pares de nombre / valor (o miembros). Un nombre es una cadena. ...

Y más tarde, la especificación dice que una cadena está rodeada por comillas.

¿Por qué?

Así,

{"Property1":"Value1","Property2":18}

y no

{Property1:"Value1",Property2:18}

Pregunta 1 : ¿por qué no permitir que el nombre en los pares nombre / valor sean identificadores sin comillas?

Pregunta 2 : ¿Hay una diferencia semántica entre las dos representaciones anteriores, cuando se evalúa en Javascript?


Pregunta 1: ¿por qué no permitir que el nombre en los pares nombre / valor sean identificadores sin comillas?

La filosofía de diseño de JSON es "Keep it simple"

"Citar nombres con " " es mucho más simple que " Puede citar nombres con " o '' pero no es necesario, a menos que contengan ciertos caracteres (o combinaciones de caracteres que lo convertirían en una palabra clave) y '' o " pueden necesita ser cotizado dependiendo de qué delimitador haya seleccionado " .

Pregunta 2: ¿Hay una diferencia semántica entre las dos representaciones anteriores, cuando se evalúa en Javascript?

No. En JavaScript son idénticos.


Ambos : y los espacios en blanco están permitidos en los identificadores. Sin las comillas, esto causaría ambigüedad al tratar de determinar qué constituye exactamente el identificador.


Creo que la respuesta correcta a la pregunta de Cheeso es que la implementación superó la documentación. Ya no requiere una cadena como clave, sino otra cosa, que puede ser una cadena (es decir, citada) o (probablemente) cualquier cosa que se pueda usar como nombre de variable, lo que supongo significa comenzar con una letra, _ , o $, e incluyen solo letras, números y $ y _.

Quería simplificar el resto para la siguiente persona que visita esta pregunta con la misma idea que yo. Aquí está la carne:

Los nombres de las variables no se interpolan en JSON cuando se usan como una clave de objeto (¡Gracias, Friedo!)

Breton, usando "identificador" en lugar de "clave", escribió que "si un identificador pasa a ser una palabra reservada, se interpreta como esa palabra en lugar de como un identificador". Esto puede ser cierto, pero lo intenté sin ningún problema:

var a = {do:1,long:2,super:3,abstract:4,var:5,break:6,boolean:7}; a.break

=> 6

Sobre el uso de comillas, Quentin escribió "... pero no es necesario, a menos que [la clave] contenga ciertos caracteres (o combinaciones de caracteres que la convertirían en una palabra clave)"

Encontré que la parte anterior (ciertos caracteres) es verdadera, usando el signo @ (de hecho, creo que $ y _ son los únicos caracteres que no causan el error):

var a = {a@b:1};

=> Error de sintaxis

var a = {"a@b":1}; a[''a@b'']

=> 1

pero el paréntesis sobre palabras clave, como mostré arriba, no es cierto.

Lo que quería funciona porque el texto entre la apertura (y los dos puntos, o entre la coma y los dos puntos para propiedades posteriores se usa como una cadena sin comillas para hacer una clave de objeto o, como dijo Friedo, un nombre de variable no lo hace) se interpola:

var uid = getUID(); var token = getToken(); // Returns ABC123 var data = {uid:uid,token:token}; data.token

=> ABC123


Dejo una cita de una presentación que Douglas Crockford (el creador del estándar JSON) le dio a Yahoo.

Habla sobre cómo descubrió JSON, y entre otras cosas, por qué decidió usar claves citadas :

... Fue entonces cuando descubrimos el problema del nombre sin nombre. Resulta que ECMA Script 3 tiene una política de palabras reservadas. Las palabras reservadas deben citarse en la posición clave, lo cual es realmente una molestia. Cuando llegué a formular esto en un estándar, no quería tener que poner todas las palabras reservadas en el estándar, porque se vería realmente estúpido.

En ese momento, estaba tratando de convencer a la gente: sí, puedes escribir aplicaciones en JavaScript, en realidad va a funcionar y es un buen lenguaje. No quería decir, entonces, al mismo tiempo: ¡y mira esto realmente estúpido que hicieron! Así que decidí, en cambio, citar las llaves.
De esa forma, no tenemos que decirle a nadie sobre cómo es.

Es por eso que, hasta el día de hoy, las claves se citan en JSON.

Puede encontrar el video completo y la transcripción here .


En javascript, los objetos se pueden usar como hash / hashtable con pares de claves.

Sin embargo, si su clave tiene caracteres que javascript no podría tokenizar como un nombre, fallaría al intentar acceder como una propiedad en un objeto en lugar de una clave.

var test = {}; test["key"] = 1; test["#my-div"] = "<div> stuff </div>"; // test = { "key": 1, "#my-div": "<div> stuff </div>" }; console.log(test.key); // should be 1 console.log(test["key"]); // should be 1 console.log(test["#my-div"]); // should be "<div> stuff </div>"; console.log(test.#my-div); // would not work.

los identificadores a veces pueden tener caracteres que no pueden evaluarse como un token / identificador en javascript, por lo tanto, es mejor poner todos los identificadores en cadenas para coherencia.


Puede reducir el tamaño de los datos si solo se permiten citas en el nombre cuando sea necesario


Si json describe objetos, entonces en la práctica obtienes lo siguiente

var foo = {}; var bar = 1; foo["bar"] = "hello"; foo[bar] = "goodbye";

por lo que entonces,

foo.bar == "hello"; foo[1] == "goodbye" // in setting it used the value of var bar

por lo tanto, incluso si sus ejemplos producen el mismo resultado, sus equivalentes en "código en bruto" no lo harían. ¿¿Tal vez por eso?? no sé, solo una idea.