执行以下代码,会输入什么呢?
let obj = {num1:117}
let res = obj
obj.child = obj = {num2:996}
var x=y=res.child.num2
console.log(obj.child)
console.log(res.num1)
console.log(y)
以上题目是考察引用数据类型还有运算符“.”和“=”的优先级
问题逐条解析:
1、let obj = {num1:117}
把obj放在栈里,把 { num1:117} 放在堆里,让obj指向堆里的 { num1:117 }
2、let res = obj
把res放在栈里,把res也指向堆里的 { num1:117 }
3、obj.child = obj = {num2:996}
重点:赋值操作先定义变量(从左到右),再进行赋值(从右到左)
(1) 定义变量 obj.child,给堆里的{ num1:117 }加一个child属性,得{num1:117,child:undefined}
(2) 赋值 obj = { num2: 996},把{ num2: 996 }放在堆里,把栈里的obj指向堆里的{ num2: 996 }
(3) 赋值 obj.child = obj,把堆里的 {num1:117,child:undefined} 的child指向 {num2: 996}
所以obj和res的最终结果如上图:
obj => {num2:996}
res => {num1:117,child: {child2:996}}
结论如下:
console.log(obj.child) // undefined
console.log(res.num1) // 117
console.log(y) // 996