javascript深入参数传递 
我们都知道javascript的基础数据类型有: Undefined 、 Null 、 Boolean 、 Number 、 String 。如果从一个变量向另一个变量复制基本类型的值,会在变量对象上创建一个新值,然后把值复制到为新变量分配的位置上。
- 案例1
 
js
var num1 = 1;
var num2 = num1; // 1
num2 = 5; // 5 
console.log(num1) // 1此后,这两个变量可以参与任何操作而不会相互影响。
- 函数传参有有区别吗?
 
js
var a = 5
function b(num) {
    num = 4
    return num
}
b(a); //4
a; //5- 注意这只是基本数据类型, 如果改成引用类型会怎么样?
 
js
var p1 = {
    name: "Tom"
}
function b(obj) {
    obj.name = "Jerry"
    return obj
}
b(p1) // { name : "Jerry"}
p1.name // Jerry| 栈内存 | 堆内存 | |
| p1, obj | 指针地址 | { name :"Tom" } | 
js
obj.name = "Jerry"obj修改了堆内存里的name值, p1还是指向那个地址. 所以p1跟着变了.
- 这样会怎么样?
 
js
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"}但是为什么不同呢?
1 . 先修改了共同指向的堆内存里的name值
- 第一步
 
| 栈内存 | 堆内存 | |
| p1, obj | 指针地址 | { name :"Tom" } | 
- 第二步
 
| 栈内存 | 堆内存 | |
| p1, obj | 指针地址 | { name :"Jerry" } | 
2 . obj重新赋值引用类型,其实就是改变了obj的指针,并没有改变p1的指针指向的地址里的值
- 第三步
 
| 栈内存 | 堆内存 | |
| p1 | 指针地址 | { name :"Jerry" } | 
| obj | 指针地址 | { } | 
- 第四步
 
| 栈内存 | 堆内存 | |
| p1 | 指针地址 | { name :"Jerry" } | 
| obj | 指针地址 | { name: "Jack" } |