请问以下JS代码输出的结果是什么?
let obj = { num1: 117 } let res = obj; obj.child = obj = { num2: 935 }; var x = y = res.child.num2; console.log(obj.child); console.log(res.num1); console.log(y);
把obj放在栈里,把 { num1:117} 放在堆里,让obj指向堆里的 { num1:117 }
把res放在栈里,把res也指向堆里的 { num1:117 }
重点:赋值操作先定义变量(从左到右),再进行赋值(从右到左)
定义变量 obj.child,给堆里的{ num1:117 }加一个child属性,得{num1:117,child:undefined}定义变量 obj,之前在栈里的obj
赋值 obj = { num2: 935 },把{ num2: 935 }放在堆里,把栈里的obj指向堆里的{ num2: 935 }
赋值 obj.child = obj,把堆里的 {num1:117,child:undefined} 的child指向 {num2: 935}
从最后一张图可看出此时:obj = { num2: 935 }res = { num1: 117,child:{ num2: 935 } }
obj.child = obj = { num2: 935 };JS引擎在执行赋值语句时,会先从左往右解析各个变量名,转换成变量值,然后从右往左执行赋值。
obj = { num2: 935 };//第二个等号赋值 { num1: 117 }.child = { num2: 935 };//第一个等号赋值
let obj = { num1: 117 }
let res = obj;让res也指向{num1:117}
obj.child = obj = { num2: 935 };(对于 var a=b=1 这样的代码,只声明第一个变量,不声明后面的,然后从右往左赋值,也就是 var a;b=1;a=b; )