3

JavaScript での変数とオブジェクトの受け渡しを理解しようとしていたところ、このページに出会いました。

JavaScriptのオブジェクトは値渡しと説明していますが、値自体は参照です。そのページに示されている例で何が起こっているかは理解できましたが、その理由についてはまだ混乱しています。「値自体が参照である」とはどういう意味ですか?

4

3 に答える 3

3

一部の言語には、関数の引数に「参照渡し」の概念があります。つまり、関数を呼び出して変数を参照渡しすると、関数は元の変数を変更して他の値を保持できます。元の変数への参照があります。

関数を呼び出して変数を渡すときに「値渡し」を使用すると、関数は値のみを取得するため、渡された元の変数を変更することはできません。

JS には「値渡し」しかありませんが、オブジェクトをパラメーターとして渡す場合、「値」は元のオブジェクトへの参照であるため、関数はそのオブジェクトのプロパティを変更、作成、または削除できますが、関数はできません。元の変数を変更して、他のオブジェクトまたは値を参照します。

例:

function changeObj(someObj) {
    someObj.a = 1000;
    someObj.c = "test";

    someObj = { "x" : 5 };
    console.log(someObj);   // { "x" : 5 }
}

var o = { "a" : 1, "b" : 2 };
changeObj(o);
console.log(o);   // { "a" : 1000, "b" : 2, "c" : "test" }

私が示したコードは、とプロパティoを持つオブジェクトを参照する変数 を作成します。次に、関数を呼び出してを渡します。関数はプロパティの値を変更し、新しいプロパティを作成します。関数は、変数が参照する同じオブジェクトを変更しています。これは、変数がそのオブジェクトへの参照を持っているためです。しかし、関数はequal をまったく新しいオブジェクトに代入します。関数はオブジェクトへの参照しか持たず、変数自体にはアクセスできなかったため、これはまったく影響しません。abchangeObjoacosomeObjooo

于 2012-08-19T22:19:50.170 に答える
2

Java、Python、および他の多くの言語と同様に、JavaScript ではオブジェクトは値ではありません

つまり、式を評価するときに取得する値は、プリミティブまたは参照のいずれかになります (参照はオブジェクトへのポインターです)。オブジェクトを作成すると、その式は参照に評価されます。オブジェクトのフィールドにアクセスしたり、オブジェクトのメソッドを呼び出したりするとき、左にあるのが参照です。基本的に、オブジェクトで行うことはすべて、オブジェクトへの参照を通じて行う必要があります。オブジェクトを直接扱うための構文はありません。

値がオブジェクト「である」変数を持つことはできません (値がオブジェクトである変数と、オブジェクトを指すポインターである値を持つ変数の両方を持つことができる C++ とは異なります)。値がオブジェクトを指す参照である変数のみを持つことができます。

これは、変数を割り当てても新しいオブジェクトが作成されないことから明らかです。参照を割り当てると、割り当てられた変数は元の参照の値のコピーを持つため、元の参照と同じオブジェクトを指します。変数に代入して新しいオブジェクトを作成する原因となる変数に入れることができるものは何もありません。

したがって、誰かが「オブジェクトを関数に渡す」と言った場合、オブジェクトは値ではないため、オブジェクトを渡すことはできません。オブジェクトへの参照を渡す必要があります。割り当てと同様に、参照を渡すと、その値がコピーされます。JavaScript は常に値渡しです。

于 2012-08-20T09:44:27.653 に答える
1

JavaScriptのオブジェクトは値渡しと説明していますが、値自体は参照です。

かなり紛らわしい表現です。つまり、オブジェクトが関数に渡されると、実際のオブジェクトではなく、オブジェクトを指す参照値が渡されます。

于 2012-08-19T22:11:36.350 に答える