0

javascriptのオブジェクトは参照によって渡されますか?はいの場合、なぜこのコードが機能しないのか。

function change(myObj)
{
 myObj={};
 myObj.a=2;
}
 o={a:1};
change(o);
alert(o.a); //alert 1

しかし、私がするとき

function change(myObj)
{

 myObj.a=2;
}
 o={a:1};
change(o);
alert(o.a); //alert 2
4

4 に答える 4

3

オブジェクトへの参照はメソッドに渡されます。最初の例では、参照が指すオブジェクトを変更しようとするのではなく、別のオブジェクトを指すように参照を変更しているため、変更はそのメソッドの外では見えません。

2 番目の例では、参照によって示されるオブジェクトの状態を変更しているmyobjため、メソッドの外部に表示されます。

于 2012-10-24T11:42:38.457 に答える
3

まず、グローバル変数 o を、値 = 1 の属性変数 a を持つ新しい匿名オブジェクトの参照に設定します

o={a:1};
。このオブジェクト {a:1} を '1A' と名付けます。

change(o);
次に、関数変更と JavaScript チェックを呼び出します。 typeof変数oとそれは「オブジェクト」です
実際には「オブジェクトを指す参照」である必要があるため、オブジェクト{a:1}の参照は関数の変更に渡されます変数がプリミティブである場合、値によってのみ渡されます

function change(myObj){
関数が変更され、デフォルトで typeof 'undefined' の変数 myObj が作成され、次に 'object' に変更されました。これは、参照パラメーターを取得したためです。変数 myObj は、オブジェクト '1A' => {a:1} および myObj を指す参照変数です。関数の変更とグローバル変数でのみ表示されます o おそらくオブジェクト '1A' => {a:1} を指している可能性があり

myObj={};
ます参照変数 myObj は、新しい匿名の空のオブジェクトを指しています {} このオブジェクトに「2B」という名前を付けます

myObj.a=2; }
ここで、参照 myObj を使用してオブジェクト '2B' => {} を設定し、値 = 2 の新しい属性 a を設定し、グローバルがオブジェクト '2B' => {a:2}

alert(o.a); //alert 1
変数を参照できないことを意味する関数のスコープを終了します。オブジェクト {a:1} へのポイントまたはポイントである可能性があります。
オブジェクト '2B' => {a:2} は関数の変更の外では見ることができず
、ガベージ コレクションによって破棄されるため、参照 o はポイントを失うことはありません参照が失われ、
オブジェクト '1A' => {a:1} がガベージ コレクションによって破棄されない
ため、変数 o がまだそれを指しているため、o を呼び出す理由 オブジェクト '1A' => {a:1} を受け取る


文法が下手で申し訳ありませんが、読みやすくするために最善を尽くします。

于 2012-10-24T17:26:42.623 に答える
2

この場合、実際のオブジェクトへの参照を上書きしています。

function change(myObj)
{
 myObj={}; //overwriting the reference in myObj here.
 myObj.a=2;
}
 o={a:1};
change(o);
alert(o.a); //alert 1

次のように考えてください。

function change(myObj = referenceToObjectPassedIn)
 myObj = new Object() ; 
  // referenceToObjectPassedIn lost in limbo
 myObject.a = 2;   //modifying newly created object. 

問題を解決するには、新しいオブジェクトを返す必要があります。

于 2012-10-24T11:42:27.107 に答える
0

例 1 では、myObj が参照するものを変更したため、意図したものとは異なるオブジェクトを変更することになります。いつ

alert(o.a);

が実行され、oa はオブジェクト宣言から変更されていないため、1 が返されます。それが少し役立つことを願っています。また、これを読むと、いくつかの問題が解決するはずです。私が最初に JavaScript を学んでいたときに助けてくれました: http://www.snook.ca/archives/javascript/javascript_pass/

于 2012-10-24T11:58:14.667 に答える