質問: パーフェクトjavascriptの124pでドット演算子とブラケット演算子の違いについて説明しているところで、 > > 些末な話ですが**プロパティアクセスの演算対象は変数ではなくオブジェクトの参照です。これは次のようにオブジェクトリテラルに直接演算可能**なことで確認できます。 > > > ``` ({x:3,y:4}).x;//3 ({x:3,y:4})["x"];//3 ``` > > 実際にオブジェクトリテラルに演算する機会はほとんどありませんが、メソッドチェーンなどの形で、演算対象が変数ではない形式を目にすることは普通にあります。 > > > とありました。 この**プロパティアクセスの演算対象は変数ではなくオブジェクトの参照です。これは次のようにオブジェクトリテラルに直接演算可能**の意味がいまいち理解できませんでした。 括弧内にx:3、x:yを持つ関数に接続した時の演算対象は、変数ではなくオブジェクトの参照、とはかみくだいて説明するとどのようになりますか。 またオブジェクトの参照というのは、つまりオブジェクトのアドレス(メモリ上の参照値)のことでしょうか。
回答: 確実に、**もとの文章が悪い**です。 ECMAScriptの仕様書には、内部的なデータ型として「Reference型」が定義されていますが、これは上の文章の「参照」とは**全く無関係**で、変数や`foo.bar`のような「代入できるもの」を意味します。 ES7の仕様書では、ドット演算子や角括弧演算子の左側に置かれるものは、`GetValue`という操作を介して得られるもの、つまりは**値**であるとしています。 `null`と`undefined`という2つの値を別にして、JavaScriptの世界にある非オブジェクトの値(数値、文字列、ブール値、シンボル)はすべてオブジェクトに変換できるので、プロパティを取ることができます。