JS函数传参时:值传递与引用传递的区别

JS函数传参时:值传递与引用传递的区别

一、先分析基础数据与复杂数据的区别 :
基本数据类型:Undefined、Null、Boolean、Number、String
引用数据类型:对象
如:var a = 10;
var b = a;
b = 20;
console.log(a); //10
console.log(b); // 20

 JS函数传参时:值传递与引用传递的区别

对象是复杂类型:引用传递的数据
计算机的内存中分为两种区域:(计算机的仓库中)

栈:存的是地址,目录
堆:存的是数据,后面的具体内容

值传递的数据:不分地址和值,地址就是值,值就是地址,在目录上就介绍了所有内容,不用再向后翻页了

引用传递的数据:区分地址和值,地址是地址,值是值,找到地址后,需要根据地址说明的位置,才能找到值

数据的传递规则:拷贝规则,都是拷贝地址

因为值传递的数据,地址和值是一个内容,所以在拷贝之后,改变新的,不会影响老的

因为引用传递的数据,地址和值是两部分内容,所以在默认拷贝之后,仅仅拷贝了地址,没有拷贝值,此时两个地址指向了同一个值,那么就会造成修改新的,会影响老的,因为只有一个值,这种现象叫引用数据的浅拷贝

深拷贝,直接拷贝值

如:var arr1 = [1,2,3];

var arr2 = arr1; //浅拷贝

深拷贝:遍历拷贝
1.重新创建一个数组,表示一个新的地址,和老地址没有关系
var arr2 = [ ];
2.拿出老的地址中的所有的值,拷贝到新的地址中
for(var i=0;i arr2.push(arr1[i]);
}
Console.log(arr2); //[1,2,3]

二、函数的传参
函数的传参是要分两种情况—— 基本类型传参(值传参)和引用传参,传参可以理解为复制变量值。基本类型复制后俩个变量完全独立,之后任何一方改变都不会影响另一方;引用类型复制的是引用(即指针),之后的任何一方改变都会映射到另一方。

1.基本类型的传参
function add(a) {
a += 10;
return a;
}

var b = 20;
var r = add(b); //按值传参 a = b
alert(b); // 20, 没变化
alert( r); // 30
因为是按值传递的,传递完后俩个变量不相互影响!

2.引用类型的传参
function setAge(obj) {
obj.age = 23;
}

var p = new Object();
setAge ( p ); //因为是对象,按引用传参 obj = p
console.log(p.age); // 23
以上代码中创建一个对象,并将其保存在变量p中。然后,这个变量被传递到setAge(obj)函数中之后就被复制给了obj。在这个函数内部,obj和p引用的是同一个对象。换句话说,即使ECMAScript说这个变量时按值传递的,但obj也会按引用来访问同一个对象。于是,在函数内部为obj添加age属性后,函数外部的p也将有所反应;因为这时的p和obj指向同一个堆内存地址。

你可能感兴趣的:(JS函数传参时:值传递与引用传递的区别)