先来看下 js 中基本类型的连续赋值是下面这样
var a = 1;
var b = a = 3;
js 中赋值是从右到左的,所以上面的连续赋值可以分解为下面这样
var a = 1;
a = 3;
var b = a;
所以最终,a = 3, b = 3
再来看一道经典面试题
var a = {n: 1 };
var b = a;
a.x = a.x.y = { n: 2 };
此题会报错,因为 a.x 是 undefined, 所以就找不到 y
var a = { n: 1 };
var b = a;
a.x = a = { n: 2 };
a.x // undefined
b // { n: 1, x: { n: 2 }}
但是面试题中的情况跟上面的不太一样
js 开始去从左到右寻找有没有未声明的变量 或者 报错信息,如果没有,先检查存在运算的优先级,当 '.' 跟 '=' 同时出现时,先进行 '.' 操作再做赋值操作也就是 '='
所以面试题的连续赋值可以分解为以下步骤:
var a = { n: 1 };
var b = a; // b = { n: 1 }
a.x = { n: 2 }; // a = { n: 1, x: { n: 2 } }, b = { n: 1, x: { n: 2 } }
a = { n: 2 };
console.log(a); // { n: 2 }
console.log(b); // b = { n: 1, x: { n: 2 } }
console.log(a.x); // undefined
console.log(b.x); // { n: 2 }
最后给大家出了三道题给大家理解
var a = { n: 1, x: { y: 2 },z: 3 }
var b = a
c = a.x = a.x.y = a.c = b = { n: 10 };
a.c // { n: 10 }
a.x.y // undefined
a.x // { n: 10 }
a // { n:1, x: { n:10 }, c: { n: 10} , z: 3 }
var a = { x: { xx: 1 }, y: 2, z: 3 };
var b = a.x;
var c = a;
b.xx = 2
a // { x: { xx: 2 }, y: 2, z: 3 }
c // { x: { xx: 2 }, y: 2, z: 3 }
var a = { x: { xx: 1 }, y: 2, z: 3 };
var b = a.x;
var c = a;
a.w = a.x.xx = a.y = a = { x: 10, y: 20 };
c // { x: { xx: { x: 10, y: 10 } }, y: { x: 10, y: 20 }, z: 3, w: { x: 10, y: 20 } }
网友评论