前言
最近在開發(fā)中寫了一個(gè)比較低級的錯(cuò)誤,使用if來判斷字符串'false',結(jié)果可想而知,結(jié)果一直是true。趁這個(gè)機(jī)會再總結(jié)回顧一下JS的基本類型以及類型轉(zhuǎn)換的相關(guān)知識。
數(shù)據(jù)類型
JS一共有七種數(shù)據(jù)類型,六種基本類型(值類型),一種復(fù)雜數(shù)據(jù)類型(引用數(shù)據(jù)類型)。
六種基本數(shù)據(jù)類型分別是number、string、symbol、boolean、null、undefined,復(fù)雜數(shù)據(jù)類型是Object。
123 // number
'123' // string
true // boolean
const eg1 = Symbol() // symbol
null // null
undefined // undefined
{} // object
const object = function () {} // object
幾種類型的簡單示例如上,下面來介紹一下類型的判斷
typeof
typeof 123 // 返回number
typeof '123' // 返回string
typeof運(yùn)算符的簡單使用就是直接加在想要判斷的變量前邊,但是這里有兩個(gè)固有的JavaScript語言的Bug需要注意
typeof null // 返回object
const testFunction = function () {}
typeof testFunction // 返回function
顯然,typeof null不應(yīng)該返回object, typeof testFunction也不應(yīng)該返回function,因?yàn)镴S里面的七種類型根本沒有function,function是屬于一種特殊的Object
==和===
現(xiàn)在前端基本使用條件語句的時(shí)候大多數(shù)情況下用全等于===,而只在部分特殊情況下使用==。===和==的區(qū)別必須就在于==會對兩端的數(shù)據(jù)在比較時(shí)進(jìn)行類型轉(zhuǎn)換。
===的使用比較簡單,只要兩端不完全一樣,就為false
1 === '1' // false
1 === 1 // true
true === 1 // false
true === true // true
null === undefined // false
==在使用的時(shí)候如果兩端類型不一樣會嘗試轉(zhuǎn)換類型
轉(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ù)是對象,另一個(gè)操作數(shù)不是,則調(diào)用對象的valueOf()方法,用得到的基本類型值按照前面的規(guī)則進(jìn)行比較
這里有兩個(gè)比較特殊的類型, null和undefined與除了自身的任何數(shù)據(jù)比較都返回false,但是他們兩個(gè)比較返回true
null == null // true
undefined == undefined // true
null == undefined // true
除了以上三種判斷,null 和 undefined和任何數(shù)據(jù)判斷都會返回false
下面是幾個(gè)使用==的例子
1 == '1' // true
true == 1 // true
false == 0 // true
false
if(test) {}
在這個(gè)條件語句里,test可以不是Boolean,但是JS會自動(dòng)把他轉(zhuǎn)成boolean類型的,只有下面六種會被轉(zhuǎn)成false,其他的都是true
- false
- null
- undefined
- 0
- ''
- NaN
值類型和引用類型的區(qū)別
在JS中還有一個(gè)重要但是會被人忽略的地方,看下例
123.toString()
'app'.toUpperCase()
在這個(gè)例子中,123是值類型number, 'app'是值類型String,他們都僅僅是一個(gè)值,按照基本規(guī)則是沒有toString和toUpperCase來調(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()
這是很多人都會忽略的知識點(diǎn),但是某些情況下也會用到,比如說我一般傾向于使用Number()來在某些情況下手動(dòng)轉(zhuǎn)換數(shù)據(jù)類型,而不是用parseInt, parseFloat這些函數(shù)
let num = Number('123')
typeof num // number
這里還有個(gè)知識點(diǎn)
let num = new Number('123')
typeof num // object
new Number()返回的是一個(gè)包裝過的對象,和Number()返回的純數(shù)值還是有所不同的。