JavaScript 関数では、ブール値と数値以外のオブジェクトが参照によって返されるというのは本当ですか?
それらが属する関数が終了したときにそれらのオブジェクトが破棄されたときに、これはどのように可能ですか?
JavaScript 関数では、ブール値と数値以外のオブジェクトが参照によって返されるというのは本当ですか?
それらが属する関数が終了したときにそれらのオブジェクトが破棄されたときに、これはどのように可能ですか?
オブジェクトへのすべての参照がなくなり、ガベージ コレクションが行われるまで、オブジェクトは破棄されません。オブジェクトが返されると、呼び出し元のコードはそれへの参照を取得し、オブジェクトはガベージ コレクションされません。
技術的には、呼び出された関数のスタック フレームは、関数が戻るときに破棄されます。ただし、オブジェクトはスタック上ではなく、ヒープ上にあります。オブジェクトへの関数のローカル参照はスタック上にあるため、破棄されますが、呼び出しコードの参照はしばらくしてから破棄されます。
補足として、関数はオブジェクトが返された後はオブジェクトを使用できないため、どのように返されるかはそれほど重要ではありません。
JavaScript 関数では、ブール値と数値以外のオブジェクトが参照によって返されるというのは本当ですか?
確かに、JavaScript のオブジェクトは常に参照によって渡されます
それらが属する関数が終了したときにそれらのオブジェクトが破棄されたとき、どのように可能ですか?
値自体ではなく、参照のみが破棄されます。参照が残っていない限り、オブジェクトはガベージ コレクションの対象になります。
そこには2つの素晴らしい答えがありますが、テストするのは簡単だと付け加えるべきだと思いました:
function modify(arg) {
arg.modified = true;
}
test = 4;
modify(test);
console.log(test.modified); // undefined
test = {};
modify(test);
console.log(test.modified); // true
test = "";
modify(test);
console.log(test.modified); // undefined
undefined は、参照渡しではなくコピーされたことを意味します。文字列も参照によって渡されないことに注意してください。
引数 (オブジェクトを含む) は、値によって関数に送信されます。参照のように動作する引数オブジェクトのプロパティは、利用可能で変更可能です。以下の例を見てください。
function changeObj(obj){obj.a *= 10; return true;}
function killObj(obj){obj = null; return true;}
function changeAndKillObj(obj){obj.a += 1; obj = null; return true;}
var a = {a:1, b:'test'};
console.log(a); //Object {a:1, b:'test'}
changeObj(a);
console.log(a); //Object {a:10, b:'test'}
killObj(a);
console.log(a); //Object {a:10, b:'test'}
changeAndKillObj(a); //Object {a:11, b:'test'}
結論: オブジェクトのプロパティを使ってやりたいことは何でもできますが、オブジェクト自体ではできません。引数への割り当ては、別のオブジェクトになり、最初のオブジェクトからリンク解除されます。