js的值傳遞和引用傳遞

我們知道js中那些是值類型,那些是引用類型介褥,這是必須要搞清楚座掘。
JavaScript中的值類型:數值递惋、布爾值、null溢陪、undefined
JavaScript中的引用類型:對象萍虽、數組、函數

堆棧

棧(stack)
由操作系統(tǒng)自動分配釋放 形真,存放函數的參數值杉编,局部變量的值等。其操作方式類似于數據結構中的棧咆霜。一種先進后出的數據結構邓馒。

堆(heap)
動態(tài)分配的內存,大小不定也不會自動釋放蛾坯。隊列優(yōu)先,先進先出光酣。

值類型是存放在棧中的基本類型,對象數據則是在堆中創(chuàng)建并在棧中保留對象在堆中的地址脉课。我們從下面的例子來理解

    var a = [1,2,3,4,5];
    var b = a;
    var c = a[0];
數據在內存中的存儲示意圖(圖片來自‘小輝_Ray’的博客)

通過變量在內存中的存儲我們可以看出來救军,所有的變量都是在棧內存中存在的,不同的是值類型存放的是值本身倘零,引用類型存放的是指向堆內存對象的地址唱遭。
基本類型與引用類型最大的區(qū)別實際就是傳值與傳址的區(qū)別。


var a =1;
var array = [1,2,3];
var object = {a:1,b:2,c:3};

function reassign(num,arr,obj){
    //將參數重新賦值
    num = '';
    //arr 是array對象的引用拷貝呈驶,我們把這個引用重新賦值拷泽,這時的arr不在指向array所指向的對象,而是指向新的空數組
    //所以這時候我們再對arr進行操作袖瞻,將不會影響array司致。
    //obj同理
    arr = [];
    arr.push(123);
    obj = '';
}
function operate(num,arr,obj){
    num = 2;
    arr.push(4);
    obj.test = 'test';
    // 我們直接對傳遞的參數進行操作,
    // 參數num是值類型聋迎,傳遞的是參數a的值拷貝蚌吸,所以我們對num進行操作不會影響外層的a變量
    // arr,和obj,一個是數組砌庄,一個是對象,都是引用類型奕枢,傳遞的是對象地址的拷貝娄昆,我們對它的操作也會影響到外層變量的值,因為他們都指向相同的堆對象缝彬。
}


reassign(a,array,object);
console.log(a);      // 1
console.log(array);  // [1,2,3]
console.log(object); // {a:1,b:2,c:3}


operate(a,array,object);
console.log(a);      // 1
console.log(array);  // [1,2,3,4]
console.log(object); // {a:1,b:2,c:3,test:'test'}

對象的拷貝

js 深拷貝 vs 淺拷貝
淺拷貝

//如果對象的屬性是引用類型萌焰,對對象的屬性進行拷貝時,拷貝的只是對象屬性的引用
function Copy(object) {
    var temp = {};
    for (var property in object) { 
      temp[property] = object[property];
    }
    return temp;
}

var obj = {}  
obj.a = "abc";
obj.b = [1,2];

var copyObj = Copy(obj);

console.log(copyObj);  // { a: 'abc', b: [ 1,2] }

copyObj.b.push(3); //這里向copyObj的b屬性中push一個值谷浅,原始的obj對象也會受到影響扒俯,因為數組是引用類型

console.log(obj);  //{ a: 'abc', b: [ 1, 2, 3 ]}

深拷貝

// 實際編碼中奶卓,很多時候淺拷貝并是我們想要的,我們希望拷貝完成后的對象和原對象不再有任何關聯(lián)撼玄。
// 深拷貝
function Copy(source, target) {
    var target = target || {};
    for (var i in source) {
      if (typeof source[i] === 'object') { //這里有個疑問夺姑, 如果對象的屬性是函數呢?
         target[i] = (source[i].constructor === Array) ? [] : {};
         Copy(source[i], target[i]);
      } else {
         target[i] = source[i];
      }
    }
    return target;
}  

var obj = {}  
obj.a = "abc";
obj.b = [1,2];
obj.c = function(){};

var copyObj = Copy(obj);

copyObj.b.push(3); //這里向copyObj的b屬性中push一個值掌猛,原始的obj對象也會受到影響盏浙,因為數組是引用類型

console.log(copyObj);  // { a: 'abc', b: [ 1,2] }
console.log(obj);  //{ a: 'abc', b: [ 1, 2, 3 ]}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市荔茬,隨后出現(xiàn)的幾起案子废膘,更是在濱河造成了極大的恐慌,老刑警劉巖慕蔚,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件丐黄,死亡現(xiàn)場離奇詭異,居然都是意外死亡孔飒,警方通過查閱死者的電腦和手機灌闺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來十偶,“玉大人菩鲜,你說我怎么就攤上這事〉牖” “怎么了接校?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長狮崩。 經常有香客問我蛛勉,道長,這世上最難降的妖魔是什么睦柴? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任诽凌,我火速辦了婚禮,結果婚禮上坦敌,老公的妹妹穿的比我還像新娘侣诵。我一直安慰自己,他們只是感情好狱窘,可當我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布杜顺。 她就那樣靜靜地躺著,像睡著了一般蘸炸。 火紅的嫁衣襯著肌膚如雪躬络。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天搭儒,我揣著相機與錄音穷当,去河邊找鬼提茁。 笑死,一個胖子當著我的面吹牛馁菜,可吹牛的內容都是我干的茴扁。 我是一名探鬼主播,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼火邓,長吁一口氣:“原來是場噩夢啊……” “哼丹弱!你這毒婦竟也來了?” 一聲冷哼從身側響起铲咨,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤躲胳,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后纤勒,有當地人在樹林里發(fā)現(xiàn)了一具尸體坯苹,經...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年摇天,在試婚紗的時候發(fā)現(xiàn)自己被綠了粹湃。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡泉坐,死狀恐怖为鳄,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情腕让,我是刑警寧澤孤钦,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站纯丸,受9級特大地震影響偏形,放射性物質發(fā)生泄漏。R本人自食惡果不足惜觉鼻,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一俊扭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧坠陈,春花似錦萨惑、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至若未,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間倾鲫,已是汗流浹背粗合。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工萍嬉, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人隙疚。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓壤追,卻偏偏與公主長得像,于是被迫代替她去往敵國和親供屉。 傳聞我的和親對象是個殘疾皇子行冰,可洞房花燭夜當晚...
    茶點故事閱讀 44,914評論 2 355

推薦閱讀更多精彩內容