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" }
相关文章
相关标签/搜索