前言
最近在開(kāi)發(fā)中寫(xiě)了一個(gè)比較低級(jí)的錯(cuò)誤,使用if來(lái)判斷字符串'false',結(jié)果可想而知词裤,結(jié)果一直是true刺洒。趁這個(gè)機(jī)會(huì)再總結(jié)回顧一下JS的基本類(lèi)型以及類(lèi)型轉(zhuǎn)換的相關(guān)知識(shí)。
數(shù)據(jù)類(lèi)型
JS一共有七種數(shù)據(jù)類(lèi)型吼砂,六種基本類(lèi)型(值類(lèi)型)逆航,一種復(fù)雜數(shù)據(jù)類(lèi)型(引用數(shù)據(jù)類(lèi)型)。
六種基本數(shù)據(jù)類(lèi)型分別是number渔肩、string因俐、symbol、boolean赖瞒、null女揭、undefined,復(fù)雜數(shù)據(jù)類(lèi)型是Object栏饮。
123 // number
'123' // string
true // boolean
const eg1 = Symbol() // symbol
null // null
undefined // undefined
{} // object
const object = function () {} // object
幾種類(lèi)型的簡(jiǎn)單示例如上吧兔,下面來(lái)介紹一下類(lèi)型的判斷
typeof
typeof 123 // 返回number
typeof '123' // 返回string
typeof運(yùn)算符的簡(jiǎn)單使用就是直接加在想要判斷的變量前邊,但是這里有兩個(gè)固有的JavaScript語(yǔ)言的Bug需要注意
typeof null // 返回object
const testFunction = function () {}
typeof testFunction // 返回function
顯然袍嬉,typeof null不應(yīng)該返回object, typeof testFunction也不應(yīng)該返回function,因?yàn)镴S里面的七種類(lèi)型根本沒(méi)有function,function是屬于一種特殊的Object
==和===
現(xiàn)在前端基本使用條件語(yǔ)句的時(shí)候大多數(shù)情況下用全等于===,而只在部分特殊情況下使用==境蔼。===和==的區(qū)別必須就在于==會(huì)對(duì)兩端的數(shù)據(jù)在比較時(shí)進(jìn)行類(lèi)型轉(zhuǎn)換。
===的使用比較簡(jiǎn)單伺通,只要兩端不完全一樣箍土,就為false
1 === '1' // false
1 === 1 // true
true === 1 // false
true === true // true
null === undefined // false
==在使用的時(shí)候如果兩端類(lèi)型不一樣會(huì)嘗試轉(zhuǎn)換類(lèi)型
轉(zhuǎn)換規(guī)則如下
- 如果有一個(gè)操作數(shù)是布爾值,則在比較相等性之前先將其轉(zhuǎn)換為數(shù)值——false轉(zhuǎn)換為0罐监,而true轉(zhuǎn)換為1
- 如果一個(gè)操作數(shù)是字符串吴藻,另一個(gè)操作數(shù)是數(shù)值,在比較相等性之前先將字符串轉(zhuǎn)換為數(shù)值
- 如果一個(gè)操作數(shù)是對(duì)象弓柱,另一個(gè)操作數(shù)不是沟堡,則調(diào)用對(duì)象的valueOf()方法,用得到的基本類(lèi)型值按照前面的規(guī)則進(jìn)行比較
這里有兩個(gè)比較特殊的類(lèi)型, null和undefined與除了自身的任何數(shù)據(jù)比較都返回false,但是他們兩個(gè)比較返回true
null == null // true
undefined == undefined // true
null == undefined // true
除了以上三種判斷,null 和 undefined和任何數(shù)據(jù)判斷都會(huì)返回false
下面是幾個(gè)使用==的例子
1 == '1' // true
true == 1 // true
false == 0 // true
false
if(test) {}
在這個(gè)條件語(yǔ)句里矢空,test可以不是Boolean航罗,但是JS會(huì)自動(dòng)把他轉(zhuǎn)成boolean類(lèi)型的,只有下面六種會(huì)被轉(zhuǎn)成false,其他的都是true
- false
- null
- undefined
- 0
- ''
- NaN
值類(lèi)型和引用類(lèi)型的區(qū)別
在JS中還有一個(gè)重要但是會(huì)被人忽略的地方屁药,看下例
123.toString()
'app'.toUpperCase()
在這個(gè)例子中,123是值類(lèi)型number, 'app'是值類(lèi)型String,他們都僅僅是一個(gè)值粥血,按照基本規(guī)則是沒(méi)有toString和toUpperCase來(lái)調(diào)用的,但是JS內(nèi)部有九個(gè)內(nèi)置的構(gòu)造函數(shù)酿箭,Number, String是其中的兩個(gè),上面的方法調(diào)用其實(shí)是這樣的
(new Number(123)).toString()
(new String('app')).toUpperCase()
這是很多人都會(huì)忽略的知識(shí)點(diǎn)复亏,但是某些情況下也會(huì)用到,比如說(shuō)我一般傾向于使用Number()來(lái)在某些情況下手動(dòng)轉(zhuǎn)換數(shù)據(jù)類(lèi)型缭嫡,而不是用parseInt, parseFloat這些函數(shù)
let num = Number('123')
typeof num // number
這里還有個(gè)知識(shí)點(diǎn)
let num = new Number('123')
typeof num // object
new Number()返回的是一個(gè)包裝過(guò)的對(duì)象缔御,和Number()返回的純數(shù)值還是有所不同的。