一道考察连续赋值的面试题

164 阅读1分钟

一道考察连续赋值的面试题

下面代码的输出结果是什么?

var a = {n: 1}; // a保持对{n:1}对象的引用
var b = a; // b保持对{n:1}对象的引用
a.x = a = {n: 2}; // a的引用被改变

a.x 	// --> undefined
b.x 	// --> {n: 2}
  1. a首先获得对{n:1}的引用,接着a赋值给bab此时指向同一个位置;
  2. a.x = a = {n: 2};连续赋值:
  • 首先考虑.运算符优先,a和b此时都保持着{n: 1}的引用,b也保持对原来位置的{n: 1}的引用,于是a.x使得原来位置的对象增加一个x属性:{n: 1} => {n: 1, x: undefined}, 此时ab还是对原来对象的引用,只不过原来对象增加了x属性
  • 接着=从右往左运算,a = {n: 2},把a的引用变成了{n: 2}这个对象,a指向的位置改变了,但b还是指向原来的位置
  • 最后,a.x=a,此时a.x是最开始解析的时候对原来位置{ n: 1, x: undefined}中的x引用,也就相当于是现在的b.x,于是{ n: 1, x: undefined} => {n: 1, x: { n: 2}},即b.x = { n: 2 }
  1. 最后ab指向不同的位置,a指向{n: 2}b指向{n: 1, x: { n: 2}}