Это ограничение литерального ключа объекта Javascript строго из-за синтаксического анализа? - PullRequest
10 голосов
/ 20 мая 2010

Пожалуйста, обратитесь к приведенному ниже коду, когда я "комментирую" одну из закомментированных строк, это вызывает ошибку (в IE) "':' ожидается".Итак, тогда мой вывод верен, что эта неспособность предоставить ссылку на значение объекта, как ключ объекта в строковом литерале;действительно ли это проблема интерпретатора / разбора?Является ли это кандидатом на ужасную (или, по крайней мере, «плохую») «часть» Javascript, в отличие от «хороших частей» Крокфорда?

<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>

Ответы [ 4 ]

15 голосов
/ 20 мая 2010

Ограничением синтаксиса литерального объекта является то, что имена должны быть литеральными. Поскольку имена могут быть указаны как идентификатор, а также строка, вместо нее невозможно использовать переменную.

Это создаст объект со свойством n, а не свойством answer:

var n = 'answer';
var o = { n: 42 };
6 голосов
/ 20 мая 2010

Вы не можете использовать переменные в качестве ключей при определении объекта с помощью {}

Поэтому они интерпретируются как имена строк и могут состоять только из символов, доступных для имен переменных

The

objectname[anythingThatReturnsValue]='value1'; - это путь.

ТАКЖЕ

Вы можете сгенерировать строку и проанализировать ее

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

Оба вышеописанных метода являются плохой практикой для создания объектов в JavaScript, и я не рекомендую их.

2 голосов
/ 20 мая 2010

Подумайте об этом: если бы это работало так, как вы хотите, это полностью внесло бы двусмысленность в язык.

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

Эти два утверждения эквивалентны в JavaScript, потому что голые ключи являются "автоматически цитируемыми"Так что, если something означает буквальную строку «что-то», то как она также может ссылаться на переменную «что-то».Не можетПоэтому, если вы хотите использовать переменные, они должны идти в квадратных скобках вместо key : value.

1 голос
/ 14 августа 2012

Вы можете попробовать:

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

obj[val] = 'bar'; 

obj.foo >>> 'bar';
...