Это объект 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 10

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.

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

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

obj[val] = 'bar'; 

obj.foo >>> 'bar';