1

私はこの次のコードを試しましたが、古いオブジェクト名のプロパティを警告しますか? オブジェクトが参照渡しであることは知っていますが、参照渡しの場合、関数内で変更されたオブジェクトは関数外でも変更する必要がありますね。

function setName(obj) {
 obj.name = "raziq";
 obj = new Object();
 obj.name = "abdul";
}
var person = new Object();
setName(person);
alert(person.name); //still yields raziq

オブジェクトが参照によって渡された場合、新しい名前を警告する必要がある場合、私は少し混乱しています。

4

3 に答える 3

3

あなたのコードで:

> function setName(obj) {

呼び出しの最初の引数の値は、ローカル変数objに割り当てられます。オブジェクトが渡された場合、objの値はそのオブジェクトへの参照です。

>   obj.name = "raziq";

これにより、値 "raziq" がobjに渡されたオブジェクトのnameプロパティに割り当てられます。nameプロパティが存在しない場合は、作成されます。

>   obj = new Object(); 

これにより、新しいオブジェクト参照がobjの値として割り当てられるため、関数に渡されたオブジェクトは参照されなくなります。

>   obj.name = "abdul";

これにより、値 "abdul" がobjによって参照されるオブジェクト(上記の行で作成および割り当てられた新しいオブジェクト) のnameプロパティ (存在しない場合は作成) に割り当てられます。

このオブジェクトには他に参照がないため、関数が終了するとすぐにガベージ コレクションで使用できるようになります。

> }
>
> var person = new Object();

新しいオブジェクトを作成し、それを変数personに割り当てます。personの値は、新しいオブジェクトへの参照です。

> setName(person);

setNameを呼び出し、上記の行で作成されたオブジェクトを渡します。この関数は、 raziqをオブジェクトのnameプロパティに割り当てます (上記を参照)。

> alert(person.name); //still yields raziq

上記で作成され、 personに割り当てられたオブジェクトのnameプロパティの値を警告します。raziqが値として割り当てられているため、それが返されます。

関数で新しいオブジェクトが作成され、割り当てステートメントでnameプロパティが作成されますが、オブジェクトはどこにも割り当てられていないか、関数から返されていないことに注意してください。

  obj = new Object();

事実上何もしません。

次のように書く方がより一般的であることに注意してください。

  obj = {};

前の行とまったく同じ結果が得られますが、入力する必要が少なく、より広く使用されているため、(わずかに) 読みやすく、維持しやすい可能性があります。

于 2013-09-30T05:55:12.137 に答える
2

を変数 obj に割り当ててもnew Object()、実際には元のオブジェクトを交換しているわけではありません。コンピューターは、インスタンス化したばかりのオブジェクトのメモリ内に新しいスポットを作成し、name プロパティに値 "abdul" を割り当てますが、以前のオブジェクトはメモリ内の別の場所に存在するため、変更されません。新しく作成されたオブジェクトが関数を離れることはありません。

変数をオブジェクトを保持するコンテナーと考え​​るのではなくobj、オブジェクトの場所の数値アドレスを持つプレースホルダーと考えてください。関数に渡すときpersonは、オブジェクト自体ではなく、そのアドレスを渡しています。したがって、関数内で新しいオブジェクトを作成すると、その新しいオブジェクトのアドレスが placeholder に格納されますobj。関数の外側の変数personには、関数で作成した新しいオブジェクトではなく、元のオブジェクトへのアドレスが含まれています。

于 2013-09-30T05:10:53.063 に答える