题目下面代码输出结果是什么var a {n: 1}; var b a; a.x a {n: 2}; console.log(a.x) // undefined console.log(b.x)// {n: 2}这题容易入坑稍不用心就会得出{n: 2}, undefined的结果。但答案却是undefined{n:2}思路这道题的关键在于优先级.的优先级大于 说到这里你可能就会恍然大悟。首先变量a和b同时引用对象{n:1}。接着执行a.x a {n: 2}语句尽管赋值是从右到左但是.的优先级高于 所以先执行a.x那么此时变量a和b引用的对象{n:1}新增了一个属性x,但没有值。即a和b的引用为{ n: 1, x: undefined}再从右到左执行赋值语句执行a {n:2}说明a的引用改变指向了新的对象{n : 2}而b的引用没有变还是 原来的{n:1, xundefined}.执行a.x {n:2}时而此时的a.x是旧的a的引用对象即b.x{n:1, xundefined}。所以此时x为{n:2} 则b的引用为{n:1, x:{n:2} }。梳理一下最终a指向{n:2},b指向{n:1, x: {n:2}},所以a.x返回undefinedb.x返回{n:2}
第8题:连续赋值与优先级的“坑”’
题目下面代码输出结果是什么var a {n: 1}; var b a; a.x a {n: 2}; console.log(a.x) // undefined console.log(b.x)// {n: 2}这题容易入坑稍不用心就会得出{n: 2}, undefined的结果。但答案却是undefined{n:2}思路这道题的关键在于优先级.的优先级大于 说到这里你可能就会恍然大悟。首先变量a和b同时引用对象{n:1}。接着执行a.x a {n: 2}语句尽管赋值是从右到左但是.的优先级高于 所以先执行a.x那么此时变量a和b引用的对象{n:1}新增了一个属性x,但没有值。即a和b的引用为{ n: 1, x: undefined}再从右到左执行赋值语句执行a {n:2}说明a的引用改变指向了新的对象{n : 2}而b的引用没有变还是 原来的{n:1, xundefined}.执行a.x {n:2}时而此时的a.x是旧的a的引用对象即b.x{n:1, xundefined}。所以此时x为{n:2} 则b的引用为{n:1, x:{n:2} }。梳理一下最终a指向{n:2},b指向{n:1, x: {n:2}},所以a.x返回undefinedb.x返回{n:2}