Является ли это ограничение буквенного ограничения объекта JavaScript строго из-за разбора?

Пожалуйста, обратитесь к приведенному ниже коду, когда я "прокомментирую" в любой из прокомментированных строк, это вызывает ошибку (в 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>

Ответ 1

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

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

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

Ответ 2

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

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

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

и

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

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

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

Ответ 3

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

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

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

Ответ 4

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

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

obj[val] = 'bar'; 

obj.foo >>> 'bar';