为何以下JavaScript代码输出{a:10}而非预期的null?
问题分析:为何代码输出
{a:10}而非预期的null? 先看这段代码:
var a = {}; (function b(a) { a.a = 10; a = null; })(a); console.log(a); // {a: 10}
核心原因是JavaScript的参数传递是按值传递,哪怕是对象类型,传递的也是引用的副本,不是引用本身:
- 全局变量
a一开始指向一个空对象。 - 调用自执行函数时,把全局
a所持有的对象引用值,复制了一份给函数的局部参数a(这个局部a和全局a是两个独立的变量,只是暂时指向同一个对象)。 - 函数里执行
a.a = 10时,因为局部a和全局a指向同一个对象,所以修改对象的属性会同步到全局的那个对象上。 - 但执行
a = null时,只是把局部变量a的指向改成了null,完全不影响全局变量a的指向——全局a依然指向原来的那个对象,只是这个对象已经被添加上了a:10的属性。 - 所以最后打印全局的
a,结果就是{a:10},而非预期的null。
内容的提问来源于stack exchange,提问作者shreyak jain
相关产品推荐
相关产品推荐

