前段時間看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)。