昨天某人分享给我一道有意思的题,问输出以及原因,网上原因说什么的都有,什么赋值,什么从左到右从右到左的,把我俩绕的是云里雾里的。今天豁然开朗,原因明明就很简单,是想的太复杂钻牛角尖了而已。
案例1
//案例1
var c = {};
var b = {};
c.a = b = {'a':1};
console.log(c.a);//{'a':1}
这个输出大家都能接收,也都能理解。c和b是两个对象,互不相干,所以,给c.a
赋值{'a':1}
,输出c.a
就是刚刚赋的值{'a':1}
。
案例2
//案例2
var d = {};
d = d.a = {'a':1};
console.log(d.a);//1
输出是1
!!!知道原因的忽略我接下来说的话。
在js中的运算符是有个优先级的,.
的优先级要比=
的优先级高。文末附赠一张优先级表。
分析上面案例:
.
的优先级高,所以先运算.
;- 先给
d.a
赋值{'a':1}
,此时d
为{a:{'a':1}}
,此时要是输出d.a
肯定是{'a':1}
。问我怎么在这个时候输出证明一下,我也不会啊; - 接着再给
d
赋值{'a':1}
,此时d
为{'a':1}
,所以输出d.a
就是1
。
问题的关键在于最后输出的时候d
是什么,这样是不是就很容易就理解了?
案例3
案例三来证明下我说的是不是对的,嘿嘿
//案例3
var e = {};
e = e.a = {'xx':1}
console.log(e.a);//undefined
没错!!输出是undefined
,因为最后的e
里面根本没有a
属性啊~~
一样的运算逻辑,先给e.a
赋值{'xx':1}
,此时e
为{a:{'xx':1}}
,接着给e
赋值{'xx':1}
,此时e
为{'xx':1}
,没有a
属性,所以输出e.a
是undefined
。