2010-05-20 2 views
10

S'il vous plaît se référer au code ci-dessous, quand je "commente" l'une des lignes commentées, il provoque l'erreur (dans IE) de "':' attendu". Donc, ma conclusion est correcte, que cette incapacité à fournir une référence à une valeur d'objet, comme une clé d'objet dans un littéral de chaîne; Est-ce strictement un problème d'interprétation/d'analyse? Est-ce un candidat pour une partie horrible (ou au moins "mauvaise") de Javascript, contrairement aux "bonnes parties" de Crockford?Cette restriction de clé littérale d'objet Javascript est-elle strictement due à l'analyse?

<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

BTW 'var key_one = keys.ONE; var obj2 = {key_one: 'value1'}; 'ne fonctionne pas comme prévu. La propriété 'obj2' sera' key_one' et non la valeur de 'key.ONE' donc pas' one'. – RoToRa

+1

Notez que bien que le dernier exemple fonctionne, il crée un objet avec la propriété 'key_one', pas la propriété' keys.One'. La variable 'key_one' n'est pas pertinente pour l'objet littéral dans la ligne suivante. – Guffa

+0

l'a ... .... qui pourrait prêter à confusion ... il devrait soit interdire toutes les chaînes "non-cotées", soit dé-référencer les références, quelles qu'elles soient –

Répondre

15

La limitation de la syntaxe de l'objet littéral est que les noms doivent être littéraux. Comme les noms peuvent être spécifiés comme un identificateur ainsi que comme une chaîne, il n'est pas possible d'utiliser une variable à la place.

Cela va créer un objet avec une propriété n, pas une propriété answer:

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

Les littéraux numériques sont aussi des noms de propriété valides. De même, dans ES5, les noms peuvent être spécifiés en tant que nom d'identificateur (c'est-à-dire, pas seulement des identifiants, mais aussi des mots réservés). Voir http://stackoverflow.com/a/9568622/96656. –

6

Vous ne pouvez pas utiliser des variables comme clés lors de la définition objet avec {}

Par conséquent, ils sont interprétés comme des noms de chaînes et peuvent comporter uniquement des caractères avaliable pour les noms de variables

la

objectname[anythingThatReturnsValue]='value1'; est le chemin à parcourir.

AUSSI

Vous pouvez générer une chaîne et l'analyser

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

Les deux méthodes ci-dessus sont mauvaises pratiques pour la création d'objets en JavaScript et je ne les recommande pas.

+0

Vous pouvez utiliser des variables comme touches pour la définition d'objets avec {}, voir le second bloc "fonctionne aussi". –

+1

@George: Non, vous ne pouvez pas. Le code s'exécute, mais il n'utilise pas la variable dans l'objet littéral. – Guffa

+0

@George: Il signifie que c'est une 'erreur de syntaxe' et il n'y a rien que vous pouvez faire à ce sujet :) –

2

Pensez-y: si elle devait travailler comme vous voulez qu'il serait tout à fait introduire une ambiguïté linguistique.

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

Les deux instructions sont équivalentes en JavaScript, car les clés bareword sont "auto-quotées". Donc, si something signifie la chaîne littérale "quelque chose", comment il pourrait également se référer à la variable "quelque chose". Ça ne peut pas. Donc, si vous voulez utiliser des variables, ils doivent aller en notation croisée au lieu de la notation key : value.

1

Vous pouvez essayer:

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

obj[val] = 'bar'; 

obj.foo >>> 'bar'; 
Questions connexes