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

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

内存分为栈区(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的内容。以上的这种方式是浅拷贝。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值