アプリ版:「スタンプのみでお礼する」機能のリリースについて

パーフェクトjavascriptの124pでドット演算子とブラケット演算子の違いについて説明しているところで、

些末な話ですが**プロパティアクセスの演算対象は変数ではなくオブジェクトの参照です。これは次のようにオブジェクトリテラルに直接演算可能**なことで確認できます。
```javascript
({x:3,y:4}).x;//3
({x:3,y:4})["x"];//3

```
実際にオブジェクトリテラルに演算する機会はほとんどありませんが、メソッドチェーンなどの形で、演算対象が変数ではない形式を目にすることは普通にあります。

とありました。
この**プロパティアクセスの演算対象は変数ではなくオブジェクトの参照です。これは次のようにオブジェクトリテラルに直接演算可能**の意味がいまいち理解できませんでした。
括弧内にx:3、x:yを持つ関数に接続した時の演算対象は、変数ではなくオブジェクトの参照、とはかみくだいて説明するとどのようになりますか。またオブジェクトの参照というのは、つまりオブジェクトのアドレス(メモリ上の参照値)のことでしょうか。

A 回答 (3件)

a=({x:3,y:4});



として a.x (3が取り出される)とすることと

({x:3,y:4}.x

は全く等価ということ。

参照というのはポインタと考えておいて問題なし。但しメモリーアドレスかどうかは
エンジンの実装次第。オブジェクトのアドレスの並ぶテーブルのインデックス
というのもポピュラーな実装です。知る必要は有りませんが⚪⚪⚪
    • good
    • 0

この質問は過去に何度か見たので参考までに。


https://teratail.com/questions/62648
https://teratail.com/questions/64078
https://detail.chiebukuro.yahoo.co.jp/qa/questio …

Re: gooooooooooooooooo さん
    • good
    • 0

その認識でよろしいと思います。



プロパティーアクセスの対象について仕様書を見ると、
オブジェクトリテラルに直接演算可能なのは仕様書に明記されています。
ECMAScript® 2016 Language Specification
12.3.2 Property Accessors
https://www.ecma-international.org/ecma-262/7.0/ …
MemberExpression . IdentifierName
MemberExpression は PrimaryExpression であり ObjectLiteral であり {PropertyDefinitionList} である

処理エンジンの実装がどうなっているかは推測するしかありませんが、
一般的に JavaScript のオブジェクトが生成されると、
すべてヒープ領域に格納され、その場所のアドレス等を参照値として後続処理に渡されます。

値渡しされることはなく、すべて参照渡しなので、
以下はすべて区別することなく、プロパティーアクセスが可能です。
* オブジェクトリテラル → ヒープ領域にオブジェクト内容を格納して、その場所の参照値を返すため
* オブジェクトを格納した変数 → 参照値が入っているため
* オブジェクトを戻す関数の呼び出し処理 → 参照値が戻るため
* new 演算子で生成したオブジェクト → ヒープ領域にオブジェクト内容を格納して、その場所の参照値を返すため
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!