前言
回顧一下運算子的強制型轉,我們可以從另一個角度來利用這些特性。
預設值
用例子來觀察:
1 | function sayHello(name) { |
透過之前的觀念,我們可以預期如果呼叫函式時,帶 / 不帶參數會出現什麼結果。
但是雖然程式沒有出錯,但是不帶參數時卻跑出 undefined 還是很奇怪的,如果想要避免這樣的情形該怎麼做呢?
以本例來說,可以給 name 一個預設值
以目前來說有兩個做法,先講之前的做法:
1 | function sayHello(name) { |
這就是一個運算子的強制型轉的應用,我們現在的印象停留在「運算子只是會回傳值的函式」,所以這個「||」會回傳什麼,我們觀察看看!

「||」不單只是回傳 true 或 false ,在「undefined || 'hello'」中回傳字串 hello,這是因為「||」會回傳可以被強制型轉為「true」的值,讓我們繼續觀察:

而「||」還有一個特性就是,當兩個值都可以被強制型轉為「true」的時候,僅會回傳第一個。
讓我們重新整理一下「||」特性
- 「
||」會回傳可以被強制型轉為「true」的值 - 當兩個值都可以被強制型轉為「
true」的時候,僅會回傳第一個值
這就是「||」運算子的特殊行為
讓我們重新把注意力拉回到這個例子
1 | function sayHello(name) { |

以這個例子來說,當我呼叫這個函式不帶入參數時,因為 name 此時是 undefined ,進行「||」運算後回傳預設字串。
但當我帶入參數呼叫函式時, name 此時並非 undefined 所以進行「||」運算後回傳第一個可以被強制型轉為「true」的值。
最後因為「=」優先性低於「||」,所以「||」回傳值後,「=」才將值回傳給變數 name 。
透過利用運算子的強制型轉特性,比起使用 if 陳述式設定預設值,我們可以讓程式碼變得更精簡易讀。
然而特別要注意的是,這邊仍然要注意數值 0,
1 | function sayHello(name) { |
如果我們帶入數值 0,得到的結果會有問題,因為數值 0 會被轉換為 false ,此時的「||」會回傳預設字串,然而這是特例就是了~
在大多數的時候,這樣子寫還是很好用的。
記得我說有兩個作法嗎?這邊介紹 ES6 新增的作法
1 | function sayHello(name = '我希望的預設值') { |

用這個作法就不用擔心數值 0 的特例了,是不是很方便呢!