javascript深刻參數傳遞

咱們都知道javascript的基礎數據類型有: UndefinedNullBooleanNumberString
若是從一個變量向另外一個變量複製基本類型的值,會在變量對象上建立一個新值,而後把值複製到爲新變量分配的位置上。javascript

  • code
var num1 = 1;
var num2 = num1; // 1
num2 = 5; // 5 
console.log(num1) // 1

此後,這兩個變量能夠參與任何操做而不會相互影響。java

  • 函數傳參有有區別嗎?
var a = 5

function b(num) {
    num = 4
    return num
}
b(a); //4
a; //5
  • 注意這只是基本數據類型, 若是改爲引用類型會怎麼樣?
var p1 = {
    name: "Tom"
}

function b(obj) {
    obj.name = "Jerry"
    return obj
}
b(p1) // { name : "Jerry"}
p1.name // Jerry
棧內存 堆內存
p1, obj 指針地址 { name :"Tom" }
obj.name = "Jerry"

obj修改了堆內存裏的name值, p1仍是指向那個地址. 因此p1跟着變了.函數

  • 這樣會怎麼樣?
var p1 = {
    name: "Tom"
}

function b(obj) {
    obj.name = "Jerry"
    obj = {}
    obj.name = "Jack"
    return obj
}
b(p1) // { name : "Jack"}
p1; // { name: "Jerry" }

看到結果按照上面的意思應該p1也是{ name : "Jack"}可是爲何不一樣呢?spa

1 . 先修改了共同指向的堆內存裏的name值指針

  • 第一步
棧內存 堆內存
p1, obj 指針地址 { name :"Tom" }
  • 第二步
棧內存 堆內存
p1, obj 指針地址 { name :"Jerry" }

2 . obj從新賦值引用類型,其實就是改變了obj的指針,並無改變p1的指針指向的地址裏的值code

  • 第三步
棧內存 堆內存
p1 指針地址 { name :"Jerry" }
obj 指針地址 { }
  • 第四步
棧內存 堆內存
p1 指針地址 { name :"Jerry" }
obj 指針地址 { name: "Jack" }
相關文章
相關標籤/搜索