Это объект JavaScript литерал ключевые ограничение строго из-за парсинга?
Пожалуйста, обратитесь к приведенному ниже коду, когда я "комментирую" любую из закомментированных строк, это вызывает ошибку (в IE)"': 'expected". Итак, правильно ли мое заключение, что эта неспособность предоставить ссылку на значение объекта, как ключ объекта в строковом литерале; является ли это строго интерпретатором / проблемой синтаксического анализа? Является ли это кандидатом на ужасную (или, по крайней мере, "плохую") "часть" 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 ответа:
Ограничение синтаксиса литеральных объектов состоит в том, что имена должны быть литеральными. Поскольку имена могут быть указаны как идентификаторы, так и строки, использовать переменную вместо них невозможно.
Это создаст объект со свойством
n
, а не со свойствомanswer
:var n = 'answer'; var o = { n: 42 };
Нельзя использовать переменные в качестве ключей при определении объекта с помощью
Поэтому они интерпретируются как имена строк и могут состоять только из символов, доступных для имен переменных{}
The
objectname[anythingThatReturnsValue]='value1';
это путь, по которому нужно идти.Также
Вы можете сгенерировать строку и разобрать ее
var s='{"'+keys.ONE+'": "value1"}'; var obj=JSON.parse(s); //or s='var obj2='+s; eval(s);
Оба вышеуказанных метода являются плохой практикой для создания объектов в JavaScript, и я не рекомендую их.
Подумайте об этом: если бы это работало так, как вы хотите, это полностью ввело бы языковую двусмысленность.
var obj = {something:"red"} var obj = {"something":"red"}
Эти два оператора эквивалентны в JavaScript, потому что ключи bareword " автоматически цитируются."Итак, если
something
означает литеральную строку "something", как она может также относиться к переменной"something". Поэтому, если вы хотите использовать переменные, они должны идти в квадратных скобках вместо обозначенияkey : value
.