/

Javascript 中的連續賦值

前言

昨天在卡斯伯大大的臉書上面看了一則有趣的貼文。

img

雖然馬上就有人在留言下方分享答案了,不過還是想記錄一下這個有意思的問題。

正確的概念是 b = c 並且這條 statement 本身會有一個回傳值 (會是 c 的值),然後 a 收到的其實是這個回傳值。

但是這看起來似乎與 b = c, a = b 的結果一樣,而且也沒什麼辦法可以用實驗去證明。(除了自己在 console 上面分解動作外)

附上一個在 console 上的小的實驗:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Welcome to Node.js v12.7.0.
Type ".help" for more information.
> a=0, b=0, c=1 // 初始化
1
> a = b = c
1
> a
1
> b // 可以發現 a, b 都拿到了與 c 一樣的值
1
> b = c // 實際上 b = c 會先被執行, 並且這一個 statement 會有一個回傳值 1 (這個回傳值也就是 c 的值)
1
> a = 1 // 最後 a 其實是拿到 b = c 的回傳值
1

還有一個有趣的地方是使用 var 與 let 來初始化,回傳值是 undefined

1
2
3
4
> let x = 3
undefined
> var x2 = 5
undefined

也提醒大家以下這一條 statement 只有 a 是 let 屬性,其他變數 (b, c) 都是 global,不要搞混了!

1
> let a = b = c

PoC

講了這麼多有一點離題了,看一下官方公布的證明方式!

img

以上印出的東西是 1 {}

這個簡單的驗證方式勝過前面的千言萬語,我們可以發現 b 並沒有被寫入任何值, a 一樣拿到了 c 的值,而這個值實際上是 b.b = c 的回傳值(即使沒有成功寫入,還是會回傳 c 本身的值)。

之後有看到類似寫法,雖然知道結果為何,但同時也別忘了理解背後的概念!