JS 连续赋值

2023-08-22  本文已影响0人  Cherry丶小丸子

先来看下 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 } }
上一篇 下一篇

猜你喜欢

热点阅读