目录:
1. 第一题
a = {n:1};
var b = a;
a.x = a = {n:2};
console.log(a.n,b.n);
console.log(a.x,b.x);
请问输出结果是什么?
a = {n:1}; //a是一个引用变量,里面存放着对象1的地址
var b = a;//b也是一个引用变量,里面也存着对象1的地址
a.x = a = {n:2};//<mark>重点在这里,我们知道在进行赋值运算时先要计算子表达式的值,a.x这个子表达式由于对象1中并没有x属性,故在对象1中新建一个x属性,注意这是在右边是有赋值运算的条件下才会新建一个x属性。</mark> 举个例子
var a.y = a.x;//a中x属性和y属性都没有,在赋值运算符前面的a.y子表达式检测到a中并没有y属性,于是新建一个y属性等着赋值,a.x子表达式在a中查询x属性没有找到返回undefined,故将undefined赋值给a.y,a.y的值为undefined。至于具体为什么是这样的底层实现,现在也不清楚,欢迎告知。
console.log(a);
<mark>a这个子表达式的值赋值前还是对象1的地址,将新声明的对象2的地址赋给a,a中现在存的是对象2的地址,现在a指向对象2。然后a,x=a;将对象2的地址赋给了对象1中的x属性,故对象1中x属性的值指向了对象2.</mark>
console.log(a.n,b.n);//输出<mark>2,1</mark>
console.log(a.x,b.x);//输出<mark>undefined,{n:2}</mark>
更新中,如有错误欢迎指正…