51

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

この問題は、以前のスタック オーバーフローの質問: Browser support for using a reserved word as a property name in JavaScript で間接的に提起されました。答えは、アレックス・ウェインによる一般的なコンセンサスのようでした:

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

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

彼らはおそらくこの分野では私よりも知識があり、状況によっては予約語を使用するのはおそらく悪い考えだと思いますが、次の 2 つの点に基づいて彼らの結論は間違っていると思います。

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

  • HTMLFormElement により、「短縮形」で予約語を使用しないことが不可能になります

最初に、予約語リストを使用して、それぞれがプロパティとして and に追加されObjectHTMLElement両方ともobj["word"]andobj.wordとして取得され、次に and として取得されましobj["word"]obj.word。63 のケースのそれぞれで、8 つのテストすべてが正しく機能しました。

第 2 に、HTMLFormElement は簡略表記を使用して要素を取得するため、これが機能する必要があります。<input name='typeof' value='scalar' />がフォームの要素である場合、 form.typeof== "スカラー" です。

私の経験からすると、通常、予約語はプログラムではなく、データに影響を与えます (たとえば、"private" という名前の列)。そのため、それらは JSON オブジェクトを汚染し、そこから入力し、そこから HTMLFormElement を汚染します。簡単に言えば、膨大な量の (IMHO 不必要な) 作業がなければ、予約語が省略形で正しく機能しないようにすることは不可能です。

これらの本当の問題のように私には思えます:

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

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

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

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

4

4 に答える 4

55

ES5 以降の ECMAScript では、予約語をオブジェクトのプロパティ名として「バフで」使用することができます。これは、オブジェクト リテラルを定義するときに引用符で「覆う」必要がなく、角かっこのインデックス表記を使用しなくても、オブジェクトで (アクセス、割り当て、および削除のために) 逆参照できることを意味します。

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

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

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

于 2013-07-28T19:08:45.390 に答える
8

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

(ただし、2 つの小さな注意:foo["class"]は問題ありませんfoo[class]form.elements["xyz"]form.xyzxyz

于 2011-08-11T08:49:08.473 に答える
8

はい、使用できます。

ちょっとした注意点として、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 圧縮です。

于 2013-08-30T12:46:07.720 に答える