JS - call by value / reference 練習題
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。
練習題 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
尚未定義,目前 a
、b
皆指向於 {n:1,x:undefined}
=
運算子的相依性為 — 由右至左,所以
- 先看:
a = {n:2}
a
的值已被指向為{n:2}
,此時b
仍為{n:1,x:undefined
- 再看:
a.x = a
此處的a.x
為b
當初被指定的位置,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.x
,b
指向{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.x
,a
指向{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}