首先讨论函数之前,先弄清楚基本类型值与引用类型值的复制问题
一、数据类型的复制分析
内存分为栈区(stack)和堆区(heap) ,如果将内存看成一本书,栈好比是书的目录,而堆就是书的内容,基本类型可以看成内容非常少,只要目录就可以概括,而引用类型就相当与内容非常多的文章,需要在书的目录上保存一个地址,然后根据书的地址再找内容。
基本数据类型:Undefined、Null、Boolean、Number、String
引用数据类型:对象
1.基本类型的复制
当基本类型的A给另一个基本类型B赋值时,会在栈里面创造一个空间,将A的值,复制一份,放在B上。
var A=5;
var B=A;
在内存示意图如下:
2.引用类型的复制
当一个引用变量obj1赋值给另一个引用变量obj2时,先将栈里创造一个空间,然后将obj1在栈里面保存的地址,复制一份给了obj2,那么obj1和obj2就根据相同地址,在堆中查找到同一份的内容。
var obj1=new Object();
var obj2=obj1;//俩个引用指向了同一个地址
obj1.name="L_DoubleYang";//添加obj1一个name,那么指向同一片内容的obj2也一样
console.log(obj2.name);//结果为:L_DoubleYang
二、函数的传参
1.基本类型的传参
基本类型的传参就像与基本类型的复制问题,将内容复制一份,经行操作。
function changeString(value){
value="html";
return value;
}
var str="javascript";
console.log(changeString(str));//html
console.log(str);//javascript
以上的代码就是将str的值,复制了一份给了局部变量value,value在函数内部操作,不会影响外面的str的值,因为他们根本不在一个地方。
2. 引用类型的传参
引用类型则是将栈里面保存的地址复制一份,给了函数内部。
function fn(obj){
obj.name="L_DoubleYang";
}
var obj1=new Object();
fn(obj1);
console.log(obj1.name);//"L_DoubleYang";
以上的代码就是将obj1在栈里面保存的堆的地址复制一份,给了函数的局部变量obj,那么obj1与obj是指向堆里面的同一片地方,那么对函数内部的obj的操作,改变了堆的内容,那么就改变了obj2的内容。以上的这种方式是浅拷贝。