1. 程式人生 > 實用技巧 >Truthy、Falsy與true、false的區別

Truthy、Falsy與true、false的區別

前段時間看Vue3的一篇文件,看到一個名詞Truthy,整篇文件看下來該名詞出現的頻率還挺高,一時間蒙圈了,這是啥玩意,咋沒見過呢,有道和google都翻譯了下,居然沒查到這貨(還是英語太差的鍋),這下更蒙圈了。

查了一番資料後發現,Truthy就是真值的意思,以前開發已經用到很多很多了,只是一直沒發現真值居然還有個專有名詞,然後遞推發現假值也有個專有名詞Falsy(有時也寫成Falsey)。

什麼是真值(Truthy),什麼又是假值(Falsy)?單從字面意思來看,所謂的真與假,可以理解為對與錯,也可以理解為通與不通。

真值:指的是在布林值上下文中,轉換後的值為真的值。同樣,假值:也就指的是在

布林值上下文中,轉換後的值為假的值。

JS所有資料型別(包括基礎資料型別和引用資料型別)除了Boolean資料型別(true和false),本身就是真值Truthy和假值Falsy外。其他資料型別在布林值上下文中都將被強制型別轉換為Boolean型值,從而以轉換後的Boolean值來判定是真值(Truthy)還是假值(Falsy)。這種強制型別轉換在實際開發過程中,特別是在變數的比較上(if語句)相當實用。

一、JS各資料型別真值示例如下(將被轉換為 true,程式碼塊會執行 if後的程式碼段):

1、字串(String):非空字串,如:“123”、‘test’、'0'、'false'

2、數字(Number):非0數字,如:0.0001、123、-0.1、-456、Infinity

、-Infinity

3、布林(Boolean):true  就不用說了

4、Symbol:

5、物件(Object):只要是物件即可,不管是空物件還是非空物件,如:{}、{ name: 'test' }

6、陣列(Array):陣列和物件一樣(陣列本質上也是物件),只要是陣列即可,不管是空陣列還是非空陣列,如:[]、['test', 1, false, null]

7、函式(Function):函式和物件也一樣(函式在本質上還是物件),只要是函式即可,函式只要定義了聲明瞭,函式就存在了,不存在空函式的說法。如:

function test() {}

function test() {
    console.log(
'test') }

注:雖然空物件和空陣列轉換成Boolean值都為真值,但空物件和空陣列本身 和 true並不能相等(弱等 ==),也就是說空物件和空陣列本身並不為真

甚至於空陣列 可以和 false相等

這裡應該是陣列和物件它們在儲存地址的一個區別,在進行Boolean值轉換的時候,實際被轉換成Boolean值的應該是儲存陣列和物件的地址,此時陣列和物件儲存空間已經開闢,哪怕陣列和物件是空的,但地址卻是實實在在的,所以為真。

而值卻不然,此時空陣列和空物件內並無資料,所以在進行值的判定時,它們卻是假的。

故而實際開發過程中,判定一個數組和物件是否為真時,不能用Boolean方法。陣列一般判定其長度(人為設定的陣列長度不算),長度為0時,即表示為空陣列;物件則一般轉換成JSON字串,看是否與'{}'相等(JSON.stringify(data) === "{}"),相等則表示該物件為空物件。

二、上面列出了各資料型別的真值示例,下面則是假值示例(將被轉換為 false,程式碼塊會繞過 if程式碼段而執行與 該if配套的else後的程式碼段):

1、字串(String):空字串,如:""、''、``(字串模板)

2、數字(Number):數字0,獨此一例(包括+0和-0)注:字元0,為,‘0’不是空字串】NaN 這個比較特殊,NaN資料型別是number,但卻是非數值

3、布林(Boolean):false  就不用說了

4、空(Null)

5、未定義(Undefined)

從上面的各個假值示例來看,它們被轉換成Boolean值後都為false。既然大家都能轉成false,那它們本身是否能互等(弱等 ==),這個還真不一定。

1:空字串、0、false三者可以互等,與其他的如null、undefined等 不等。

2、null 和 undefined可以互等,自己和自己等,但與其他幾種不等

3、NaN和那個都不等,包括自己都不等(爺生天地間,六親不認,獨一無二,孫大聖不服來戰)

既然說到NaN六親不認,那麼就出現一個問題,該怎麼去判定是不是NaN呢。雖然上面用型別判定 typeof(NaN) 返回的是number,但是很明顯不能以這個作為判定的基準。

為此JS專門提供了一個函式 isNaN() 來判定一個變數是不是NaN,isNaN方法在進行是否是NaN判定時,會先將引數進行資料型別轉換(轉換成number型),可以轉成純數字的(轉成正負數和0都行)都為非NaN(返回false),否則為NaN(返回true)。

三、總結:從上述測試結果來看,Truthy和Falsy是一個大範圍,是廣義上的真和假;而true和false則是兩個明確的值,是狹義上的真和假,所以Truthy和true、Falsy和false還是有區別的。

同時轉成Boolean值為真的,不代表它們本身也是真值(陣列和物件別躲,說的就是你們)。