jshashtableの状態です。
JavaScriptの組み込みオブジェクトは、以下の方法でハッシュテーブルの機能を提供します。 の角括弧表記を使用したハッシュテーブル機能を提供します。 プロパティを使用することができます。 文字列や数値であれば、プロパティの角括弧表記を使ったハッシュテーブル機能を提供します。
私の知る限り、キーは文字列のみです(数値はいずれにせよ文字列に強制されるため)。私は、上記のことが誤りであることを確認したいだけです(キーが数字であることはありえないので)。
ECMA標準はこのことについて何か述べていますか?
それとも、ブラウザ固有の実装なのでしょうか?
JavaScriptの組み込みオブジェクトは、以下のような方法でハッシュテーブルの機能を提供します。 プロパティを角括弧で囲む記法で、キーが 文字列または数値
それは正しくないようです - オブジェクトキー are always strings may be strings or (since ECMAScript 2015, aka ECMA-262 ed 6) symbols.しかし、それは角括弧のプロパティアクセスとは別のトピックです。
ECMA-262 ed 3 § 11.2.1 を参照してください(ECMAScript 2017 (draft). も参照してください)。
プロパティは、ドット記法のどちらかを用いて、名前でアクセスします。
MemberExpression .IdentifierName となります。
CallExpression .IdentifierName .
または、ブラケット記法。
MemberExpression [ Expression ]。
CallExpression [ Expression ] です。
ドット表記は、以下の構文変換で説明します。
MemberExpression .IdentifierName .
は、以下のものと動作が同じです。
MemberExpression [
] と同じです。と同様です。
CallExpression .IdentifierName となります。 は、> と動作が同じです。
CallExpression [
] と同じです。 と同じです。 ここで、は、identifier-name-string を含む文字列リテラルです。 gt;識別子名文字列(identifier-name-string)*は、Unicodeエスケープ処理後の同じ文字列です。 IdentifierNameと同じ文字列を含む文字列リテラルです。
したがって、ドット記法を使用する場合、ドットの後のビットはIdentifierNameの基準に適合しなければならない。しかし、角括弧を使用する場合、評価され文字列に解決される式が提供される。
簡単に言うと、角括弧表記は、例えば、以下のように、式を使用してプロパティにアクセスできるように提供されています。
var y = {};
var x = 'foo';
y[x] = 'foo value';
上記の例では、x
は角括弧で囲まれているので、評価されて文字列 'foo'が返されます。このプロパティは y
にはまだ存在しないので、追加されます。そして、y
の foo
プロパティには 'foo value' という値が代入されます。
一般的には、角括弧の中の 式 が評価され、その toString()
メソッドが呼び出されます。その値がプロパティ名として使用されます。
ドットプロパティアクセスメソッドでは、識別子は評価されませんので。
y.bar = 'bar value';
は値 bar value
を持つプロパティ bar
を作成します。
もし、数値のプロパティを作りたいのであれば
y[5] = 5;
は 5
を評価し、それが文字列でないことを確認して、(多かれ少なかれ) Number(5).toString()
を呼び出し、プロパティ名として使用される 5
という文字列を返します。そして、値として 5
が代入され、これは数字です。
この回答は ECMAScript ed3 の時代に書かれたものですが、状況は変化しています。後述の参考文献やMDNを参照してください。
キーは文字列のみで、Arrayで使用するような数値キーは強制的に文字列として格納されます。
var arr = [true];
arr[0] === true;
arr['0'] = false;
arr[0] === false;
ECMAScript仕様、42ページ。ECMA-262 Script 3rd Editionに記載されています。
プロダクション PropertyName : NumericLiteral
は次のように評価される。
1.NumericLiteralの値を形成する。
2.ToString(Result(1))を返す。