题目一:
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 }
执行栈 中的 示意图 :