ECMAScript 除了有 Boolean Primitive 外,還有獨特的 Truthy Value 與 Falsy Value 概念;簡單的說,其他 Type 也能自動轉成 Boolean,這使得 if 與 && 與 || 有了更多應用。
Version
macOS Catalina 10.15.2
VS Code 1.41.1
Quokka 1.0.271
ECMAScript 2015
Falsy Value
在
if ()或!!會轉型為false
以下 6 種值會視為 Falsy Value:
- Boolean:
false - Empty String:
'' - Empty Number:
0,NaN - Non-Value:
null、undefined
false 視為 falsy value 理所當然,但剩下 5 種就比較特別。
Truthy Value
在
if ()或!!會轉型為true
除此以上 6 種外,剩下都是 truthy value:
- Boolean:
true - Non Empty String:
'foo' - Non Empty Number:
1、2… - Object:
{}、{name: 'Sam'} - Array:
[]、[1, 2, 3]
其中有幾個比較特別:
Infinity
let num1 = Infinity
let num2 = -Infinity
!!num1 // ?
!!num2 // ?
無論是 Infinity 或 -Infinity,都是 truthy value。
!!會將任意值轉成 boolean

Object
let obj1 = null
let obj2 = {}
let obj3 = { title: 'FP in JavaScript' }
!!obj1 // ?
!!obj2 // ?
!!obj3 // ?
所有 object ,只要不是 null 都是 truthy value,無論是 empty object 或 non-empty object。

Array
let arr1 = []
let arr2 = [1, 2, 3]
!!arr1 // ?
!!arr2 // ?
所有 array 都是 truthy Value,無論是 empty array [] 或 non-empty array。

===, ==, !!
let num = 0
num === false // ?
num == false // ?
!!num // ?
===:必須 type 與 value 都成立才會true,num是 number,故回傳false==:自動轉型,num會轉型成false!!:手動轉型,num會轉型成false
Conclusion
- 大體上 primitive
空值都是 falsy value,但 object 不受此限,因此 empty object 與 empty array 都是 truthy value