引用类型地址

TIP

引用类型变量,存储的都是该引用类型所在的地址。

习题一


let arr = [1, 2, 3] // arr --> 0x001 --> [1, 2, 3]

for (let x of arr) { // arr --> 0x001
  arr = [4, 5, 6] // arr --> 0x002 --> [4, 5, 6]
  console.log(x)
}

// 输出
1
2
3

习题二 hard

var a = { n: 1 }
var b = a
a.x = a = { n: 2 }

console.log(a.x)
console.log(b.x)

// 输出
undefined
{ n: 2 }

// 解析
涉及知识点:运算符优先级、引用类型地址、赋值顺序。

逐行解析:
a = { n: 1 }
a --> 0x001 --> { n: 1 }

b = a
b --> 0x001 --> { n: 1 }

a.x = a = { n: 2 }
点号运算符优先级大于赋值运算符,则先执行点号运算
a.x
[0x001].x --> { n: 1, x: undefined }
0x001 --> { n: 1, x: undefined }
后自右向左执行赋值运算
a = { n: 2 }
a --> 0x002 --> { n: 2 }
a.x = a
[0x001].x = { n: 2 } --> { n:1, x: {n: 2 } }
0x001 --> { n:1, x: { n: 2 } }

可以看到,当前
a --> 0x002 --> { n: 2 }
b --> 0x001 --> { n:1, x: { n: 2 } }

解析 js 连续赋值的坑open in new window
搞懂 JavaScript 中的连续赋值open in new window
关于 a.x = a = { n: 2 } 面试题解析open in new window

Last Updated:
Contributors: Vsnoy