前段時間看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值為真的,不代表它們本身也是真值(陣列和物件別躲,說的就是你們),
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/196608.html
標籤:JavaScript
上一篇:Gulp插件,及使用方法。
下一篇:Node.js模塊加載機制
