JS - call by value / reference 練習題

Chloe Lo
chloelo925
Published in
4 min readFeb 18, 2019
Photo by Artem Sapegin on Unsplash

11/Sep/2019 觀念導正:

let a = b = 2

Q: 此例中 b 是讀取值的對象還是要被賦值的對象?

A: 賦值

此例中 2 肯定是讀取值~ 如果 b 是賦值對象那就是 a=2, b=2
如果是讀取值對象~才會有順序問題。

再看下方的練習題,如練習題 1,a.x = a ={n:2}

就等同於 a.x ={n:2}, a={n:2},先賦值

再用記憶體位置去判別,邏輯就比較通了。

關於記憶體位置的解讀,推薦以下影片,一下打通任督二脈 XD。

[ Alex 宅幹嘛 ] 👨‍💻 深入淺出 Javascript30 快速導覽 | Day 14:JavaScript References VS Copying

練習題 1:

1️⃣:var a = {n:1}

讓物件 {n:1} 指向給變數 a

2️⃣:var b = a

讓變數 b與變數 b共同指向 {n:1}

3️⃣:a.x = a = {n:2}

參閱 MDN 運算子優先序

. 運算子優先於 =運算子,先判定 a.x 是否有值

因為 a.x 尚未定義,目前 ab 皆指向於 {n:1,x:undefined}

= 運算子的相依性為 — 由右至左,所以

  • 先看:a = {n:2}
    a 的值已被指向為 {n:2} ,此時 b 仍為 {n:1,x:undefined
  • 再看:a.x = a
    此處的 a.xb 當初被指定的位置, a{n:2} 帶入,原本 b的值 {n:1,x:undefined} 中的 x 被指定為 {n:2},所以 b 最後的值為 {n:1,x:{n:2}

4️⃣:console.log(a.x); console.log(b.x);

此時 a = {n:2}; b ={n:1,x:{n:2}}; 所以可以得知

console.log(a.x) ➡️undefined

console.log(b.x) {n:2}

練習題 2:

1️⃣:var a = {x:1}

讓物件 {x:1} 指向給變數 a

2️⃣:var b = a

讓變數 b與變數 b共同指向 {x:1}

3️⃣:b = b.x = { x: 2 };

先判定 b.x 是否有值

因為b.x 有值,所以直接可以開始判斷式

  • 先看 b.x = { x: 2 } ,此時 變數a 、變數b 皆指向 {x:{x:2}}
  • 再看 b = b.xb 指向 {x:2}

4️⃣:console.log(a.x); console.log(b.x);

此時 a = {x:{x:2}}; b ={x:2}; 所以可以得知

console.log(a.x) ➡️{x:2}

console.log(b.x) 2

練習題 3:

依此類推…..

1️⃣:var a = {n:1}

讓物件 {n:1} 指向給變數 a

2️⃣:var b = a

讓變數 b與變數 b共同指向 {n:1}

3️⃣:a = b.x = {a:2};

先判定 b.x 是否有值

因為b.x 有值,所以直接可以開始判斷式

  • 先看 b.x = {a:2} ,此時 變數a 、變數b 皆指向 {n:1,x:{a:2}}
  • 再看 a = b.xa 指向 {a:2}

4️⃣:console.log(a.x); console.log(b.x);

此時 a = {a:2}; b ={n:1,x:{a:2}}; 所以可以得知

console.log(a.x) ➡️undefined

console.log(b.x) {a:2}

--

--