web-dev-qa-db-ja.com

参照としてのjavascriptパスオブジェクト

私はオブジェクトを持っています。それは関数内の多くの異なる関数に渡されます。これらの関数はオブジェクトの値を変更する場合と変更しない場合がありますが、変更する場合は、オブジェクトの最新の変更を取得したいと思います。

以下は私がやろうとしていることです:

var ob = {text: 'this is me', name: 'john'}

function (object) {

     changeObject(object);
     customObjectChanger(object);
     callback = function (object) {
          object.text = 'new text';
     }

     callback(object);

     // object value here should be object{text: 'new text', name: 'john'};    
}
35
Basit

JavaScriptでは、オブジェクトは常にcopy-referenceによって渡されます。それが正確に正しい用語かどうかはわかりませんが、オブジェクトへの参照のコピーが渡されます。

これは、関数の実行が完了した後、オブジェクトに加えられた変更が表示されることを意味します。

コード:

var obj = {
  a: "hello"
};

function modify(o) {
  o.a += " world";
}

modify(obj);
console.log(obj.a); //prints "hello world"

そうは言っても、渡された参照のコピーのみであるため、re-assign関数内のオブジェクトの場合、これはnotは、変更した参照のコピーのみであるため、関数の外部からは見えません。

コード:

var obj = {
  a: "hello"
};

function modify(o) {
  o = {
    a: "hello world"
  };
}

modify(obj);
console.log(obj.a); //prints just "hello"
113
Adam Rackis

「オブジェクト」はJavaScriptの値ではないため、「渡す」ことはできません。

扱っている値はすべて参照(オブジェクトへのポインター)です。

参照を渡すか割り当てると、同じオブジェクトを指す別の参照が与えられます。もちろん、他の参照を介して同じオブジェクトを変更できます。

4
newacct

これは、値渡しおよび参照渡し(Javascript)の詳細な説明です。このコンセプトでは、変数を参照渡しすることと、変数を参照渡しすることについて話します。

値渡し(プリミティブ型)

var a = 3;
var b = a;

console.log(a); // a = 3
console.log(b); // b = 3

a=4;
console.log(a); // a = 4
console.log(b); // b = 3
  • jSのすべてのプリミティブ型に適用されます(文字列、数値、ブール値、未定義、null)。
  • aはメモリ(たとえば0x001)に割り当てられ、bはメモリ内の値のcopy(たとえば0x002)を作成します。
  • したがって、変数の値を変更しても、2つの異なる場所に存在するため、他の変数には影響しません。

参照渡し(オブジェクト)

var c = { "name" : "john" };    
var d = c;

console.log(c); // { "name" : "john" }
console.log(d); // { "name" : "john" }

c.name = "doe"; 

console.log(c); // { "name" : "doe" }    
console.log(d); // { "name" : "doe" }
  • JSエンジンはオブジェクトを変数cに割り当て、メモリ(0x012)を指します
  • いつ d=c、このステップではdは同じ場所(0x012)を指します。
  • 両方の変数の変更値の値を変更する。
  • 関数はオブジェクトです

特別な場合、参照渡し(オブジェクト)

c = {"name" : "jane"}; 
console.log(c); // { "name" : "jane" }    
console.log(d); // { "name" : "doe" }
  • Equal(=)演算子は、新しいメモリ空間またはアドレスを設定します
1