10

请参考下面的代码,当我“注释”任一注释掉的行时,它会导致“':'预期”的错误(在 IE 中)。那么我的结论是正确的,即无法提供对对象值的引用,作为字符串文字中的对象键;这严格来说是解释器/解析问题吗?与 Crockford 的“好部分”相比,这是 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

4 回答 4

15

文字对象语法的限制是名称必须是文字。由于名称可以指定为标识符和字符串,因此不能使用变量代替。

这将创建一个具有属性的对象n,而不是属性answer

var n = 'answer';
var o = { n: 42 };
于 2010-05-20T11:28:47.407 回答
6

定义对象时不能使用变量作为键{}

因此,它们被解释为字符串名称,并且只能包含可用于变量名称的字符

objectname[anythingThatReturnsValue]='value1';是要走的路。

您可以生成一个字符串并解析它

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

以上两种方法在 JavaScript 中创建对象都是不好的做法,我不推荐它们。

于 2010-05-20T11:26:06.510 回答
2

想一想:如果它按照你想要的方式工作,它会完全引入语言歧义。

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

这两个语句在 JavaScript 中是等价的,因为裸词键是“自动引用的”。因此,如果something表示文字字符串“某物”,它如何也可以引用变量“某物”。它不能。因此,如果您想使用变量,它们必须使用方括号表示法而不是key : value表示法。

于 2010-05-20T11:44:16.673 回答
1

你可以试试:

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

obj[val] = 'bar'; 

obj.foo >>> 'bar';
于 2012-08-14T15:29:17.773 回答