js中的值传递和引用传递

在js中值传递和引用传递是让人容易混淆的问题,下面我就来根据自己的理解来区分一下这两个传递方式:

值传递

值传递是两个变量传递前后互补干扰,无法造成影响,下面代码举例说明

var a=7;
function fuc(a){
  a++;
}
fuc(a)
console.log(a);  //7

向上面这样,当我们给a赋值之后,在通过调用函数调用吧a的值自增,但是改变的a的值只是在函数中,没有改变函数外部的值,这种方式传递叫做值传递,实际的原理可以用堆栈解释一下:

当我们赋值a=7的时候,因为数据是基本数据类型,所以存在栈中,而函数fuc的值a是引用数据类型得数据所以存在堆中,而栈中只是存放一个地址,(基本数据类型有哪些,number,string,boolean,null,undefined,symbol以及未来ES10新增的BigInt(任意精度整数)七类。引用数据类型(Object类)有常规名值对的无序对象{a:1},数组[1,2,3],以及函数function(){}等)。如下图所示:

var a=7时;

fuc(a)时;

所以当我们打印a的值得时候a的值是保存在堆中的因而没有变。

引用传递

值传递的时候通过函数调用之后如果没有在函数中找到所需要的值,会去函数外面找所需要的变量及其值,改变的过程如下:

代码:

var a=7;
function fuc(){
	a++
}
fuc(a);
console.log(a); //8

堆栈中数据存储:

var a=7;

fuc(a)时,这时候因为函数中没有a变量,所以没有数据保存到堆栈中,所以函数就会去函数外面寻找,就会找到上图的栈中存贮的a=7,所以在函数调用的时候,改变的是函数外边的值,也就是存储在栈中的值。

或者换一种方式理解,代码如下:

function test(obj){
  obj.name = 'lili';
}
var tal = new Object();
test(tal);
console.log(tal);  //{name:'lili'}

当函数test创建的时候,会创建一个对象obj:

当我们创建一个空对象tal的时候:

test(tal)的时候:tal=obj,

当调用函数的时候,因为tal和obj都是引用数据类型,所以都把数据保存在堆中,栈中只是存一个地址,当我们赋值tal=obj的时候,这时就是把tal对象在栈中创建的地址指向改为和obj是一样的,都指向obj在堆中的内存数据,这种传递数据的方式叫做引用传递。

除此之外参数也是按照值传递的,具体代码如下:

function test(obj){
	obj.name = 'lili';
	var obj = new Object();
	obj.name = 'kiki';
}
var tal = new Object();
test(tal);
console.log(tal);  //{name:'lili'}

堆栈中的存储数据过程如下:

然后函数调用:

当重新声明obj对象的时候,并且赋值之后:

这时候我们看到创建一个新对象,就相当于把obj的值放到一个新的堆中,改变对象obj的值之后,因为tal对象还是指向之前的obj的堆,所以数据没有改变,并且由此可以看出,对象的传递也是按照引用传递的方式来传递的。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值