關於變量的傳遞方式

在JS中,變量到底是按值傳遞還是按引用傳遞的呢?要弄清楚這個問題,我們得首先熟悉下面的一些概念:

在JS中,數據類型分爲基本類型值(Undefined;Null;Boolean;Number;String)和引用類型值(即對象類型:Object、Array、Function、Date等)

那什麼是按值傳遞呢?舉個例子:

例:

var a=1;

var b=a;

console.log(b);//1

這個例子很好理解,我們都知道a的值是1,然後把a的值賦予給b,所以b也是1,但是這個兩個1是相互獨立的,b中的1相當於a中的1複製的副本,改變其中任何一個的值都不會對另外一個造成影響:

b+=1;

console.log(b);//2

console.log(a);//1

這個就是按值傳遞。

 

再來說一下按引用傳遞:

例:

var obj1={

  name:”100”

};

var obj2=obj1;

console.log(obj2.name);//100

obj2.name=”111”;

console.log(obj2.name);//111

console.log(obj1.name);//111

第一次打印出來的是100,這個我們很容易理解,但是第二次打印的卻是111,這是爲什麼呢?這個就是按引用傳遞和按值傳遞的不同之處。在引用傳遞中,複製對象時,並不會在堆的內存中新生成一個一模一樣的對象,只是多了一個指向這個對象指針的變量罷了。將obj1的值複製給obj2,而這個值的副本就是一個指針,這個指針指向存儲在堆中的一個對象,也就是說創建了一個新的內存地址傳給了obj2,obj1和obj2同時指向同一個對象,當去改變這個對象時,它們的值都會改變,即如果改變它們當中任意一個的值,另外一個也會跟着改變,如上面的例子中改變”obj2.name”的值之後,obj1.name”的值也由原來的”100”變成了”111”。

 

再看下面的例子:

例:

var person={

   name:”Zhangsan”

};

function obj(change){

   change.name=”Lisi”;

   return change;

}

var result=obj(person);

console.log(result.name);//Lisi

console.log(person.name);//Lisi

從運行結果上面看,我們似乎覺得這是按引用傳遞,不急,我們再來看下面的例子:

var person={

   name:”Zhangsan”

};

function obj(change){

   change ={

name:Lisi

}

   return change;

}

var result=obj(person);

console.log(result.name);//Lisi

console.log(person.name);//Zhangsan

在上面的例子中,在函數內重新定義了一個對象,也就是說現在堆內存中含有兩個對象,外部person指向的是老的對象,被傳入參數後指向的是新定義的對象,所以調用返回的值是新定義對象的值,而如果是按引用傳遞的話,那麼person.name打印出來的是Lisi,所以證明是按值傳遞的。

 

通過以上分析,我們可以得出:在JS中,變量都是按值傳遞的!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章