JavaScript のオブジェクトが参照渡しであることは ECMA-262 のどこに書かれているのでしょうか。


JavaScript のオブジェクトは参照渡しであることはよく言われますし、実際に JavaScript 言語処理系ではそのように扱われています。

--- ここから : サンプルコード ---
var obj = { a: "sample", b: "test" };
// 別の変数にオブジェクトを渡す
var obj2 = obj;
// 識別子 obj が参照するオブジェクトのプロパティの値を変更
obj.a = "modified";
// 識別子 obj2 が参照するオブジェクトも変更される
// -> obj と obj2 は同じオブジェクトを参照している (参照渡し)
print( obj2.a );
--- ここまで : サンプルコード ---

しかし、ECMA-262 (5th edition) [ http://www.ecma-international.org/publications/standards/Ecma-262.htm ] を読んでも、オブジェクトが参照渡しであるということがどこに書かれているのかわかりませんでした。 オブジェクトが参照渡しされるということがどこに書かれているかご存知でしたら教えてください。 よろしくお願いします。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2011/06/20 20:00:04

回答1件)

id:windofjuly No.1

回答回数2625ベストアンサー獲得回数1149

PDF内をVariableで検索してみてもそれらしいのが見当たらなかったのでReferenceで検索してみるとp.13に下記の項目が見当たりました

Every object created by a constructor has an implicit reference (called the object’s prototype) to the value of its constructor’s “prototype” property. Furthermore, a prototype may have a non-null implicit reference to its prototype, and so on; this is called the prototype chain. When a reference is made to a property in an object, that reference is to the property of that name in the first object in the prototype chain that contains a property of that name. In other words, first the object mentioned directly is examined for such a property; if that object contains the named property, that is the property to which the reference refers; if that object does not contain the named property, the prototype for that object is examined next; and so on.

うまい翻訳が出来なかったので、該当箇所の翻訳をググってみました

(3th editionの原文との違いは確認していませんが同じはずです)

http://www2u.biglobe.ne.jp/~oz-07ams/prog/ecma262r3/4_Overview.html

ECMAScript はプロトタイプベースの継承をサポートする。コンストラクタは皆関連づけられたプロトタイプを持ち、また、そのコンストラクタに作成されたオブジェクトは皆、そのコンストラクタに関連づけられたプロトタイプ (オブジェクトのプロトタイプと呼ばれる) に暗黙の参照がある。プロトタイプは、更にそのプロトタイプに null 以外の暗黙の参照があるかもしれない(以下同様である); これはプロトタイプチェーン (prototype chain) と呼ばれる。オブジェクトのプロパティへが参照される場合、その参照は、プロトタイプチェーン中でその名前のプロパティを持つ最初のオブジェクトのプロパティへの参照である。言いかえれば、まず直接指定されたオブジェクトが、そのプロパティの有無を検査される; そのオブジェクトが指定されたプロパティを持つ場合、それが参照するプロパティである; そのオブジェクトが指定のプロパティを持たない場合、そのオブジェクトのプロトタイプが次に検査される; 以下同様に続く。

 

あらためて下記のシリーズなどを平行して見てみると判りやすいかもしれないです

http://www.atmarkit.co.jp/fdotnet/ajaxjs/ajaxjs03/ajaxjs03_01.html

id:vividcode

私の質問がざっくりしすぎていて申し訳ないのですが、引用された箇所は object が参照渡しになる説明にはなっていませんね。

もっと具体的に質問を書くと、

・object (Object type に属する value) の同一性 (同じ value なのか違う value なのか) はどのようにして決定されるのか? 新しく object が生成されると、Object type に属する既存のどの value とも異なる value として扱われるように思えるが、それで正しいのか?

・9.12 節の "The SameValue Algorithm" において、"Return true if x and y refer to the same object." とあるが、x も y も object (Object type に属する value) であるはずなのに object を refer するとはどういうことなのか?

です。 もし何かご存知でしたらよろしくお願いします。

2011/06/14 01:01:08
  • id:vividcode
    「参照渡し」 という言葉は適切ではなかったと思います。 「オブジェクト型 (Object type) は参照型である、というのは ECMA-262 の仕様上適切な表現なのかどうか」 という質問だと思ってください。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません