JS按值傳遞和按引用傳遞

1. 按值傳遞

將參數(shù)值傳遞給過(guò)程的方式,使過(guò)程訪問(wèn)到變量的復(fù)本。結(jié)果,過(guò)程不可改變變量的真正值,傳遞的是變量的內(nèi)容。

2. 按引用傳遞

將參數(shù)地址傳遞給過(guò)程的方式,使過(guò)程訪問(wèn)到實(shí)際的變量。結(jié)果,過(guò)程可以改變變量的真正值,傳遞的是變量在內(nèi)存中地址的指針或引用。

先舉個(gè)兩個(gè)例子:

var a = 10;

var b = a;

a = 20; 

console.log(b);   //   10
var a = [1,2]

var b = a;

a[0] = 3;

console.log(b)  //   [3,2]

有沒有覺得很神奇,number,string都是基本數(shù)據(jù)類型,而基本數(shù)據(jù)類型存放在棧區(qū),是直接按值存放的,可以直接訪問(wèn);對(duì)象和數(shù)組是存放在堆中的,通過(guò)引用來(lái)賦值,實(shí)際是一個(gè)存放在棧內(nèi)存的指針,這個(gè)指針指向堆內(nèi)存中的地址。
現(xiàn)在我們來(lái)看一下ECMAScript中的數(shù)據(jù)類型。主要分為兩大類:

基本數(shù)據(jù)類型 (undefined,boolean,string,number,null

var a = 3;

var b = 3;

console.log(a === b)   //   true

所以記住基本數(shù)據(jù)類型的比較是值的大小。
此處如果用==呢?是會(huì)進(jìn)行類型轉(zhuǎn)換的,舉個(gè)簡(jiǎn)單點(diǎn)的例子:

var a = 10;

var b = '10';

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

引用數(shù)據(jù)類型(object(數(shù)組和函數(shù))

引用數(shù)據(jù)類型在內(nèi)存中是這樣存的,每個(gè)空間大小不一樣,要根據(jù)情況進(jìn)行特定分配,如下所示:

var  personA = {name:'fcc'}

var personB = {name:'fcc1'}

var personC = {name:'fcc2'}
堆內(nèi)存

舉個(gè)例子:

var a =[1,2,3,4];

var b =[1,2,3,4];

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

雖然變量a,b內(nèi)容是一樣的,但是在內(nèi)存中卻存在不同的位置,他們指的不是同一個(gè)對(duì)象。

傳值與傳址有和不同?

基本數(shù)據(jù)類型的=是在內(nèi)存中新開辟一段棧內(nèi)存,然后把值賦值到新的棧中。

var a = 1;

var b = a;   //   只傳遞值
a++;

console.log(a);   //   2

console.log(b);   //   1
基本數(shù)據(jù)類型的賦值過(guò)程

由圖可以看出,基本數(shù)據(jù)類型是相互不會(huì)影響的。

引用數(shù)據(jù)類型的賦值是傳址,改變指針的方向。就是說(shuō)引用類型的賦值是對(duì)象保存在棧中的地址,兩個(gè)變量之間就指向同一個(gè)對(duì)象,所以操作的時(shí)候互相之間會(huì)有影響。

var a = {};    //   a保存了一個(gè)空對(duì)象的實(shí)例

var b = a;    //   a和b都指向了這個(gè)空對(duì)象


a.name = 'fcc';

console.log(a.name);    //    'fcc'

console.log(b.name);    //    'fcc'


b.age = 23;

console.log(b.age);   //    23

console.log(a.age);   //    23

console.log(a == b);   //    true
引用類型賦值地址

由圖可以看出,引用數(shù)據(jù)類型之間是會(huì)相互影響的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,649評(píng)論 1 32
  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時(shí)...
    歐辰_OSR閱讀 30,228評(píng)論 8 265
  • 所謂能量,就是能讓人變好的東西。我倒覺得,不用整天鼓吹什么正能量。因?yàn)樗苍S會(huì)使你盲目的努力,而負(fù)能量卻可以讓人正...
    若嫣閱讀 310評(píng)論 0 0
  • 最近一直在培訓(xùn),久違的回到課堂,重溫學(xué)生時(shí)光。 六小時(shí)高強(qiáng)度課程學(xué)習(xí),直讓我叫苦連連,注意力大不如前不說(shuō),坐得我腰...
    布gi閱讀 209評(píng)論 0 0

友情鏈接更多精彩內(nèi)容