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