0

かなり長い間本当に悩まされていた質問があり、そのトピックをカバーするリソースが見つからないようです. JavaScript のプロパティ名を文字列リテラルまたは数値リテラルにするにはどうすればよいですか?

var obj = {
    "bar": "foobar",
    "foo": function() { return bar; }
}

このトピックは、数年前に知って以来、私を悩ませてきました。より詳細な情報をどこで入手できるか、またはこれが何と呼ばれているかさえわかりません。新しいオブジェクトがメンバー、bar および foo で作成され、obj 変数に割り当てられていることがわかっているので、これがどのように設定されているかについて混乱することはありません。

var "bar" = "foobar"; のような変数を作成することはできません。構文エラーが発生するためです。オブジェクトリテラルに対してどのように有効ですか? これに関するヘルプは非常に高く評価されます。

4

4 に答える 4

7

JavaScriptでは、プロパティ名は文字列値(任意の文字列値)です。それが言語の指定方法です。

関連するプロダクション:

PropertyName :  
    IdentifierName
    StringLiteral
    NumericLiteral

識別子または数値リテラルが指定されている場合、それは文字列値(SV)に変換されます。

参照:http ://ecma-international.org/ecma-262/5.1/#sec-11.1.5

したがって、たとえば:

var obj = {
    foo: true, // the name of this property becomes 'foo'
    'bar': true, // the name of this property becomes 'bar'
    123: true // the name of this property becomes '123'
};

空の文字列をプロパティ名として使用することもできます。

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

obj[''] // 'foo'
于 2013-03-12T03:22:21.017 に答える
2

JavaScriptオブジェクトリテラルはハッシュマップの実装です。つまり、キーと値のペアです。キーは、引用符で表すことも、引用符なしで表すこともできます。

ただし、プロパティに文字列としてアクセスする場合は、次の構文を使用します。

obj[str]

ただし、その名前でプロパティにアクセスする場合は、

obj.name

于 2013-03-12T03:21:39.713 に答える
2

The object literal syntax you are using is just part of JavaScript's syntax. You can use numeric or string literal as a property name as well as any valid variable name as a property name. Note that invalid variable names must be wrapped in quotes, but can still be property names (numeric literals being an exception).

That is, you can have obj = {'"': value}, i.e. a quote, as a valid object property name. However, if you left off the apostrophes there it would be a syntax error.

The variable name syntax, e.g. {nameWithoutQuotes: "value"} is allowed, as far as I can tell, for convenience. It has no special meaning and is treated as if it were a string literal property name. It would look very odd to have " everywhere in an object literal definition, and it also makes sense when using similar accessor syntax. For example:

obj = {"with quotes": "q", withoutQuotes: "x"};
obj["with quotes"];
obj.withoutQuotes;

Note that the method of access with a property name that requires quotes also requires quotes whereas when quotes are not required access can be done without them.

As for why "obj" = "string" is not allowed, other than the fact that it is invalid syntax, that is because the "obj" literal does not create a reference in memory that can be assigned to. The obj = {} notation creates a reference that is stored in obj and memory is allocated for each of its properties as described by the literal syntax. You could make a similar statement about obj = "string";


It may also be worth nothing that the quotes cannot be omitted from a JSON string for property names. Many parsers will not allow it.

于 2013-03-12T03:35:07.370 に答える
1

それが絶対的に有効であることを確認するには、オブジェクトが連想配列であることを思い出す必要があります。

 foo.bar === foo['bar']

この場合、連想配列のキーは任意の文字列です。

于 2013-03-12T03:22:53.867 に答える