10

以下のコードを参照してください。コメント アウトされた行のいずれかを「コメント イン」すると、(IE で)「':' expected」というエラーが発生します。したがって、文字列リテラルのオブジェクトキーとしてオブジェクト値への参照を提供できないという私の結論は正しいです。これは厳密にはインタプリタ/解析の問題ですか? 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

でオブジェクトを定義するときに、変数をキーとして使用することはできません{}

したがって、これらは文字列名として解釈され、変数名に使用できる文字のみで構成できます。

the

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"}

2 つのステートメントは 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 に答える