JavaScript按值传递与按共享传递

在开始JavaScript按值传递与按共享传递的探讨之前,我们先要知道JavaScript的五种基本数据类型、按值传递与按引用传递的概念。
- JavaScript的5种基本数据类型分别是:Undefined、Null、Boolean、Number、String
- 按值传递:函数的形参是被调用时所传实参的副本,修改形并不会影响实参。
- 按引用传递:函数的形参接收实参的内存地址,而不再是副本。这意味着函数形参的值如果被修改,实参也会被修改。这里可以给大家预告一下,虽然说JavaScript没有按引用传递的说法,但后面将要提到的“按共享传递”中会用到“按引用传递”的概念。
在JavaScript中,基本数据类型按值传递,比如

var a=100;
function foo(x){
    x=1;
}
foo(a);
console.log(a)

最后输出的结果为100,变量a并没有被修改为1
而JavaScript中对象的传递与基本类型不同,它是按共享传递的。我对按共享传递的理解是——按共享传递时,我们应该把形参看做由两部分组成,一部分是形参本身、一部分是形参属性所指向的地址。形参本身是按值传递的,但形参属性所指向的地址却和实参属性地址一样,可以看作按引用传递。
如何理解上面这堆不知所云的概念呢? 我们来看个栗子

var a={
    x:1,
    y:2
}
function foo(obj){
    obj={
        x:3,
        y:4
    }
}
foo(a)
console.log(a)

最后输出的结果a仍然是{x:1,y:2}。这是因为形参本身是按值传递的,修改形参本身不会造成实参的修改,如果我们把上面的代码改成如下这样子

var a={
    x:1,
    y:2
}
function foo(obj){
    obj.x=3;
    obj.y=4;
}
foo(a)
console.log(a)

最后就会很神奇的发现a被修改为了{x:3,y:4},这是因为形参属性所指向的地址与实参所指向的地址一样,修改的形参的属性就同时修改了实参的属性。
所以,大家就只需要记住五种基本类型按值传递,对于对象而言,直接修改形参对实参没有效果,而修改形参的属性却可以同时修改实参的属性。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值