web-dev-qa-db-ja.com

連結(動的)文字列をJavaScriptオブジェクトキーとして使用しますか?

var test = "test123"
var test123 ={
    "key" + test: 123
}

このコードは機能しません。 「キー」+テストの何が問題になっていますか?

43
thinkanotherone

"key" + testは式であり、識別子でも文字列リテラルでも数値リテラルでもないため、オブジェクトリテラルのキーとして許可されている唯一のものです。

このような動的キーのオブジェクトを作成した後、[]表記を使用する必要があります。

var test123 = {};
test123["key" + test] = 123;

識別子は基本的に変数を呼び出すことができる文字のサブセットと同じです(文字、数字、_および$。数字で始まることはできません)。文字列リテラルは'または"で囲まれた任意の文字列です。

したがって、オブジェクトリテラルで使用できるキーの種類は次のとおりです。

{
  a0:   true, // valid identifier
  $$_:  true, // same
  123:  true, // valid numeric literal
  012:  true, // same (octal)
  0xf:  true, // same (hex)
  "@":  true, // not allowed as an identifier
  '0a': true  // same
}

参照: http://es5.github.com/#x11.1.5

PropertyName

IdentifierName

StringLiteral

NumericLiteral

66
pimvdb

ES6では、オブジェクトリテラル内で動的キーを定義できます。

const test = "test123"
const test123 = { [`key${test}`]: 123 };  //{ keytest123: 123 }
46
Ben

リテラル表記ではできますが、できません(ES6より前)。

var test123 = {};
test123["foo" + "bar"] = 'baz';

test123.foobar === 'baz'; // true
10
max

コードはtest123.("key" + test) = 123と同等です。これは、なぜ間違っているのかを理解するのに役立ちます。

文字列の名前でフィールドにアクセスするには、["name"]表記が必要です。他の表記法(あなたのものと. one)は識別子が必要です。

3
Krizz

Javascriptは、オブジェクトのプロパティを定義する2つの方法を提供します。

  1. object.propertyName = value;

この状況では、propertyNameは編集できず、計算できません。次のことはできません。

    object.('property'+'Name')

ご覧のように

    object = {propertyName:value};
    object = {'propertyName':value};

彼らは等しい

  1. 「[]」でプロパティ名として変数を使用できます。

できるよ :

 var a  = "propertyName";
 object[a] = value;

今回は文字列を使用する必要があります

object[propertyName] = value;//error
object["propertyName"] = value;//correct
object = {'propertyName':value};//correct
object = {propertyName:value};//correct
2
jilykate