1

JavaScript では、プリミティブの変数は値によって渡され、オブジェクトの変数は参照によって渡されるのに対し、関数の引数ではプリミティブと参照の両方が値によって渡されるため、混乱の共通点が生じることを読んでいます。

いじり回しの過程で、次のコードを作成しましたが、頭を悩ませています。

> function setName2(obj) {
... obj.name="matt";
... obj = new Object();
... obj.name="obama";
... }

私が設定した場合

var person = new Object();
person.name = "michelle";

次に実行します

> setName2(person);

私は得る

> person.name;
'matt'

作成された新しいオブジェクトはローカル オブジェクトへのポインターであり、グローバルな「人」のプロパティには影響しないため、これは理にかなっています。

ただし、最初に設定した場合はどうなりますか

 var obj = new Object();
    obj.name = "michelle";

次に実行します

  > setName2(obj);

?

私は同じ結果を得ます。これは、コンパイラが同じ名前の 2 つの変数 (obj グローバルと obj ローカル) をヒープ内の異なる場所への参照として認識し、それぞれが異なるポインターの関連付けを持っていることを意味するのでしょうか、それともこの現象には別の説明がありますか?

4

5 に答える 5

2

JavaScript には参照渡しがありません。すべてが値渡しされます。ただし、一部の値はそれ自体がオブジェクトへの参照です。この違い (参照渡しと is-a-reference) は、多くの混乱を招きます。

物事を明確にする例:

function f(o) { ... }
var obj = { foo: 42 };
f(obj);

で何をしてもfobjは常に同じオブジェクトを参照します。これは、引数が参照によって渡されないためです。ただし、objにコピーされる値は、oそれ自体がオブジェクトへの参照です。oこれが、関数内で行われたプロパティの変更がobj返された後に表示される理由です。

于 2013-09-14T11:55:06.313 に答える
1

混乱は、「参照渡し」が人々によって誤解されているか、間違った意味で使用されているという事実から生じます。

パラメータは値渡しです。つまり、メソッド内の値を変更しても、元の値は変更されません。

プリミティブの場合、プリミティブの値はその値です。オブジェクトの場合、オブジェクトの値はそれへの参照です。オブジェクトのコンテンツにアクセスして変更することはできますが、参照自体の値を変更することはできません。

C++ や C# などの他のプログラミング言語では、「参照渡し」とは、次のものを渡すことを意味します。 - プリミティブ型への参照 - オブジェクトへの参照への参照参照自体を変更することもできます。

Javascript には参照渡しはありません。

于 2013-09-14T11:58:58.513 に答える
1

一方、関数の引数では、プリミティブと参照の両方が値渡しされます。

本当じゃない。関数の引数について特別なことは何もありません。

function setName2(obj) {

これは、オブジェクトへの参照を引数として受け入れます。

obj.name="matt";

これnameにより、参照先のオブジェクトのプロパティが変更されます。

obj = new Object();

これにより、元のオブジェクトへの参照が新しいオブジェクトへの参照に置き換えられます。

obj.name="obama";

これにより、新しいオブジェクトの name プロパティが変更されます。元のオブジェクトは変更されません。

于 2013-09-14T11:51:27.830 に答える
1

Javascript は値渡しを使用します。

混乱は、オブジェクトが参照変数 (一種のポインター) によって保持されていることです。実際、ほとんどの一般的な言語 (java、javascript など) には、実際の参照渡しの動作はありません。これを理解する別の方法はpass-reference-by-valueかもしれませんが、正式にはそのようなものはありません。

つまり、オブジェクトをパラメーターとして渡すと、実際にはオブジェクトへの参照を渡しで渡していることになります。

function setName2(obj) {
  ...
}

setName2(person);

ここでperson(参照、または必要に応じて「ポインタ」)の内容は、値によって新しいローカル変数にコピーされます: obj

objpersonは、同じオブジェクトへの参照を保持する異なる変数です。

そのため、新しいオブジェクトobj = new Object();obj指すようになります。しかしperson、それはまだ完全に異なる変数であるため、影響を受けません。

于 2013-09-14T12:14:56.663 に答える
0

あなたがどこでそれを読んだのかわかりませんが、それは絶対に真実ではありません. オブジェクトは参照によって渡されます。関数のパラメータかどうかはまったく関係ありません。

于 2013-09-14T11:51:09.097 に答える