Является ли это ограничение буквенного ограничения объекта 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';