js函数内部修改外部传入的(引用类型的)变量,导致的修改结果异常

题目一:
function setN(obj){
obj.name='屌丝';
obj = new Object()
obj.name = '腐女';
};
var per = new Object();
setN(per);
alert(per.name); //屌丝
  • 解释:改变的是函数内部变量的值。
    之所以传入的外部参数也改变是因为 (引用类型)内存地址传递给了函数内的变量,函数内部变量拿着地址 去修改了 堆内存 里面的值。
    之后,函数内部的变量又被重新赋值,变成了 new Object () 的地址 。再进行改变则不会影响之前传入的地址。
    (见执行栈示意图,或耐心看完下一题)
题目二:
var a = { n: 1 };
var b = a;
a.x = a = { n: 2 }
a.x // -> undefined
b.x // -> { n: 2 }

首先:. 的优先级 高于 =
a = { n: 1 } -> [栈地址a = 00XXX11] // 00XXX11 对应的值是 { n : 1 }
b = a -> [栈地址b = 00XXX11]
a.x = a = { n: 2 }

  • 先执行 a.x : 00XXX11.x =
  • 从右到左赋值: [栈地址a = 00XXX11] -> [栈地址a = 00XXX22] // 00XXX22 对应的值是 { n : 2 }
  • 返回第一步: 00XXX11.x -> { n: 2 } // [00XXX11 = 00XXX22]
所以: a.x 相当于 00XXX22.x => { n: 2 }.x 输出: undefined ; b.x 相当于 00XXX11.x => { x: { n: 2 } }.x 输出: { n: 2 }
 执行栈 中的 示意图 :

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值