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

首先讨论函数之前,先弄清楚基本类型值与引用类型值的复制问题

一、数据类型的复制分析

内存分为栈区(stack)和堆区(heap) ,如果将内存看成一本书,栈好比是书的目录,而堆就是书的内容,基本类型可以看成内容非常少,只要目录就可以概括,而引用类型就相当与内容非常多的文章,需要在书的目录上保存一个地址,然后根据书的地址再找内容。
基本数据类型:UndefinedNullBooleanNumberString
引用数据类型:对象
堆和栈
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的内容。以上的这种方式是浅拷贝。

发布了1 篇原创文章 · 获赞 4 · 访问量 64

猜你喜欢

转载自blog.csdn.net/L_DoubleYang/article/details/104434184