2010-05-20 10 views
10

Consulte el código siguiente, cuando "comento" en cualquiera de las líneas comentadas, provoca el error (en IE) de "':' esperado '. Entonces, mi conclusión es correcta, que esta incapacidad para proporcionar una referencia a un valor de objeto, como una clave de objeto en un literal de cadena; ¿Es estrictamente un problema de interpretación/análisis? ¿Es este un candidato para una "parte" horrible (o al menos "mala") de Javascript, en contraste con las "buenas partes" de Crockford?¿Es este objeto Javascript restricción literal de clave estrictamente debido al análisis?

<script> 
var keys = {'ONE': 'one'}; 

//causes error: 
//var obj1 = {keys.ONE: 'value1'}; 
//var obj1 = {keys['ONE']: 'value1'}; 

//works 
var obj1 = {}; 
obj1[keys.ONE] = 'value1'; 

//also works 
var key_one = keys.ONE; 
var obj2 = {key_one: 'value1'}; 
</script> 
+1

Por cierto 'var = key_one keys.ONE; var obj2 = {key_one: 'value1'}; 'no funciona como espera que lo haga. La propiedad 'obj2' será' key_one' y no el valor de 'key.ONE', por lo tanto, no' one'. – RoToRa

+1

Tenga en cuenta que aunque el último ejemplo funciona, crea un objeto con la propiedad 'key_one', no con la propiedad' keys.One'. La variable 'key_one' es irrelevante para el objeto literal en la siguiente línea. – Guffa

+0

lo obtuve .... eso podría ser confuso ... debería deshabilitar todas las cadenas "sin comillas" o eliminar las referencias, sean lo que sean –

Respuesta

15

La limitación de la sintaxis del objeto literal es que los nombres tienen que ser literales. Como los nombres se pueden especificar como un identificador así como una cadena, no es posible usar una variable en su lugar.

Esto creará un objeto con una propiedad n, no una propiedad answer:

var n = 'answer'; 
var o = { n: 42 }; 
+0

Los literales numéricos también son nombres de propiedad válidos. Además, en ES5, los nombres pueden especificarse como un nombre de identificador (es decir, no solo identificadores, sino también palabras reservadas). Ver http://stackoverflow.com/a/9568622/96656. –

6

No puede utilizar variables como claves en la definición de objeto con {}

lo tanto están siendo interpretados como nombres de cadena y pueden consistir sólo en caracteres es libre para los nombres de variables

la

objectname[anythingThatReturnsValue]='value1'; es el camino a seguir.

TAMBIÉN

se puede generar una cadena y lo revisará

var s='{"'+keys.ONE+'": "value1"}'; 
var obj=JSON.parse(s); 
//or 
s='var obj2='+s; 
eval(s); 

Ambos métodos anteriores son malas prácticas para la creación de objetos en JavaScript y yo no los recomiendan.

+0

PUEDE usar variables como claves al definir objetos con {}, vea el segundo bloque "también funciona". –

+1

@George: No, no puedes. El código se ejecuta, pero no usa la variable en el objeto literal. – Guffa

+0

@George: Quiere decir que es un 'error de sintaxis' y no hay nada que puedas hacer al respecto :) –

2

Piense en esto: si fuera a trabajar de la manera que desea que introduciría una ambigüedad totalmente idioma.

var obj = {something:"red"} 
var obj = {"something":"red"} 

Las dos declaraciones son equivalentes en JavaScript, porque las claves de palabras simples se "autocuentan". Entonces, si something significa la cadena literal "algo", también podría referirse a la variable "algo". No puede. Por lo tanto, si desea utilizar variables, tienen que ir en notación de corchetes cuadrados en lugar de la notación key : value.

1

Usted puede tratar de:

var obj = {}; 
var val = 'foo'; 

obj[val] = 'bar'; 

obj.foo >>> 'bar'; 
Cuestiones relacionadas