javascript伝値機構


もっと読む
jsには値伝達だけがあり、引用伝達が存在しないことを明確にすべきである.ここでは二つの場合に分けて、まず基本的なデータタイプで、Numberタイプを例に挙げます.
var a = 2;
var b = a;
a = a + 1;
alert("a = " + a);//   :a = 3
alert("b = " + b);//   :b = 2
 
ここでvar b=aは、aの値をコピーしてbに伝えたものです.その後、両者は関係したくない変数です.メモリのデータ記憶構造を見てみます.
 スタック:        
 
    a.  :   3
    b  :   2
 
 
参照のタイプについては、jsも値伝达机构であるが、このときの伝达値はメモリ中の対象のアドレスであり、アドレス値はスタック中に存在し(固定スタックメモリを占める)、対象はヒープ中に存在する(不固定メモリを占有する):
var person = new Object();
function f(person){
     person.name = "   ";
     person.age = "20";
     person = new Object();
     person.name = "   ";
     person.age = "10";
}
f(person);
alert("  :" + person.name  + ",  :" + person.age );
//   :  :   ,  :20 
 
ここで注意したいのは、var宣言のpersonは大域変数であり、パラメータとしてのpersonは局所変数であり、つまり両者は同じ変数ではなく、最初はスタックの中に一つのperson変数しかなく、オブジェクトのアドレス値が格納されています.関数を呼び出すと、その変数のアドレス値が一部変数personに存在します.これはスタック内に二つのperson変数があり、中には同じアドレス値があり、同じブロックのオブジェクトを指し、続いてローカル変数のアドレス値をオブジェクトに名前年齢属性を追加しました.プログラムは続けて下に進みます.「person=new Object()」という言葉は、ローカル変数のアドレス値をヒープ内の別のオブジェクトに向けたアドレス値に置き換え、次は別のオブジェクトに名前と年齢属性を追加しました.このとき、グローバル変数のアドレス値は変わりません.関数がなくなったら、局部変数はもう機能を失いました.「alert」+person.name  + "年齢:"+person.age";このコードの中のpersonは実はグローバル変数を指しています.その結果、最初のオブジェクトの属性が印刷されます.もしよく理解できないなら、このコードは下のコードと同じ意味です.
var person = new Object();
function f(p){
     p.name = "   ";
     p.age = "20";
     p = new Object();
     p.name = "   ";
     p.age = "10";
}
f(person);
alert("  :" + person.name  + ",  :" + person.age );
 私たちは実際に関数内で局所変数だけを操作しました.
次のコードを見てください.
var person = new Object();
function f(p){
     p.name = "   ";
     p.age = "20";
     p = new Object();
     person.name = "   ";
     person.age = "10";
}
f(person);
alert("  :" + person.name  + ",  :" + person.age );
//   :  :   ,  :10
 これは分かりやすいですか?