先来看一下题目:
var a = { n: 1};
var b = a;
a.x = a = {n: 2};
console.log(a.x); // 输出?
console.log(b); // 输出?
储备知识:
- 优先级从高(20)到低(1)排列
优先级 | 运算类型 | 关联性 | 运算符 |
---|---|---|---|
20 | 成员访问 | 从左到右 | . |
3 | 赋值 | 从右到左 | = |
- 关联性
a OP b OP c;
左关联(左到右)相当于把左边的子表达式加上小括号(a OP b) OP c,右关联(右到左)相当于a OP (b OP c)。
譬如:赋值运算符是右关联的,a = b = 5;
结果 a 和 b 的值都会成为5。这是因为赋值运算符的返回结果就是赋值运算符右边的那个值,具体过程是:b被赋值为5,然后a也被赋值为 b=5 的返回值,也就是5。
这下你知道答案了吗?
console.log(a.x); // undefined
console.log(b); // {n:1,x:{n:2}}
分析过程:
- 首先将值
{n:1}
赋值给a
,再将a
赋值给b
,此时变量a
和b
存储的都是指向同一个值{n:1}
的内存地址(假定是AAAFFF000) a.x
由于.
运算符优先级高,所以先给{n:1}
声明了一个x
属性,现在的a
指的是{n:1,x:undefined}
- 创建一个新的值
{n:2}
(假定是AAAFFF111),赋值给a.x
,那么(AAAFFF000)中存储的值就是{n:1,x:{n:2}}
- 将
{n:2}
赋值给a - 整理一下:
地址 | 存储的值 | 对应的对象 |
---|---|---|
AAAFFF000 | {n:1,x:{n:2}} | b , |
AAAFFF111 | {n:2} | a |