web-dev-qa-db-ja.com

プロパティ名として予約語を使用する、再訪

予約語をオブジェクトのプロパティ名として使用できますか?

この問題は、以前のStack Overflowの質問で間接的に発生しました: JavaScriptで予約語をプロパティ名として使用するためのブラウザーサポート 。答えは Alex Wayne による一般的なコンセンサスのようでした:

これらの単語を使用できますが、文字列としてのみ使用でき、省略表現のプロパティとしては使用できません。

foo['class']; // cool
foo.class;    // not cool

この分野ではおそらく私よりも知識が豊富で、状況によっては予約語を使用するのは悪い考えだと思いますが、2つに基づいて結論が間違っていると思いますポイント:

  • 「速記」プロパティとして使用する予約語のテスト

  • hTMLFormElementにより、「速記」で予約語を使用することができなくなりますnot

最初に、予約語リストを使用して、それぞれがObjectおよびHTMLElementのプロパティとして追加され、両方ともobj["Word"]およびobj.Word、その後obj["Word"]およびobj.Word。 63の各ケースで、8つのテストすべてが正常に機能しました。

第二に、HTMLFormElementは、短縮表記を使用して要素を取得するため、これが必要です。 <input name='typeof' value='scalar' />はフォームの要素であり、その後form.typeof ==「スカラー」。

私の経験から、予約語は通常、データが与えられたもので(たとえば、「private」という名前の列)、プログラムに与えられたものではありません。そのため、JSONオブジェクトを汚染し、そこから入力され、そこからHTMLFormElementを汚染します。簡単に言えば、膨大な(IMHO不要)作業なしに、予約語notを簡単に正しく動作させることはできません。

私にはこれらの本当の問題のようです:

  • 予約語ではなく、既存のpropertiesプロパティと競合しないように注意する必要があります

  • (すべてではないにしても多く)変数は予約語にできません

  • プロパティとして予約語を使用すると、混乱する可能性があります(必ずしもそうではありません)

この結論は正しいのですか?プロパティ名として予約語を使用し、文字列または短縮形としてそれらにアクセスすることは問題ありません-少し常識が状況に適用されている限り?

43
cc young

ECMAScriptでは、ES5から、予約語を「バフで」オブジェクトプロパティ名として使用できます。これは、オブジェクトリテラルを定義するときに引用符で囲む必要がないことを意味し、角括弧のインデックス表記を使用せずにオブジェクトの間接参照(アクセス、割り当て、削除)を行うことができます。

ただし、予約語は依然として識別子名として[〜#〜] not [〜#〜]を使用できます。これは、仕様で非常に明確に述べられており、ここでやや強調して述べられています(実際の言語仕様を読まなくても目を出血させたくない場合)...

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Reserved_Words

以下はキーワードであり、ECMAScriptが特別な動作を指定するため、変数、関数、メソッド、またはオブジェクト識別子として使用することはできません。

48
UIZE

あなたが何を言いたいのか私にはよくわからないので、私が与えることができる唯一の答えは次のとおりです。はい、プロパティ名として予約語を使用しても構いません。

(ただし、2つの小さな備考:_foo["class"]_は問題なく、_foo[class]_ではありません。また、xyzという名前の要素にアクセスするには、_form.elements["xyz"]_ではなく_form.xyz_を使用する必要があります。)

7
RoToRa

はい、使用できます。

ちょっとしたコメントですが、YUIコンプレッサーを使用する場合は、js予約語の1つに等しいプロパティ名を引用符で囲む必要があります。

たとえば、これは圧縮しません

var a = { case : "foo"}; // syntax error, "invalid property id"
a.for = "bar"; // syntax error, "missing name after . operator"

これはします

var a = { "case" : "foo"}; //OK
a["for"] = "bar"; //OK

YUI Compressorを使用したJavaScript/CSSのオンライン圧縮 ここでテストできます。

6
gumkins

はい、ほとんどのブラウザ(IE9 +を含む)

実際には、「プロパティ名として予約されている単語」のエントリがKangax互換性テーブルにあります

http://kangax.github.io/compat-table/es5/#test-Object/array_literal_extensions_Reserved_words_as_property_names

2