一、種類(lèi)
截止目前,JavaScript有七種數(shù)據(jù)類(lèi)型:number,string,boolean,symbol (ES6增),null,undefined,object 。
其中,前六種屬于基本數(shù)據(jù)類(lèi)型,object 屬于可由基本類(lèi)型組成的復(fù)雜類(lèi)型。
二、熟練掌握
- 數(shù)據(jù)類(lèi)型好比經(jīng)濟(jì)基礎(chǔ),打好了地基才能構(gòu)建高樓,這是踏入JS的第一步。
- (由于設(shè)計(jì)上的Bug)沒(méi)有一個(gè)能完美輔助我們判斷上述數(shù)據(jù)類(lèi)型的方法。
判斷類(lèi)型常用到 typeof 操作符,typeof xxx 之后得到的都是字符串。
| xxx 的類(lèi)型 | number | string | boolean | symbol | undefined | null | object | function |
|---|---|---|---|---|---|---|---|---|
| typeof xxx | 'number' | 'string' | 'boolean' | symbol | 'undefined' | 'object' | 'object' | 'function' |
關(guān)于 typeof 的兩大Bug如下:
typeof null // 'object'
typeof function() {} // 'function'
三、基本類(lèi)型 number string boolean null undefined
值不可變的,即值本身無(wú)法被改變
1. number 數(shù)字類(lèi)型
JavaScript 內(nèi)部,所有數(shù)字均以64位浮點(diǎn)數(shù)存儲(chǔ),并沒(méi)分離出整數(shù)類(lèi)型,所以 1 === 1.0,表示同一個(gè)數(shù)字。但是當(dāng)運(yùn)算需要整數(shù)時(shí),JavaScript 又會(huì)自動(dòng)把 64位浮點(diǎn)數(shù) 轉(zhuǎn)成 32位整數(shù),然后再進(jìn)行運(yùn)算。
浮點(diǎn) 是一種對(duì)于實(shí)數(shù)的近似值數(shù)值表現(xiàn)法,由一個(gè)有效數(shù)字(即尾數(shù))加上冪數(shù)來(lái)表示,通常是乘以某個(gè)基數(shù)的整數(shù)次指數(shù)得到。以這種表示法表示的數(shù)值,稱(chēng)為浮點(diǎn)數(shù)(floating-point number)。利用浮點(diǎn)進(jìn)行運(yùn)算,稱(chēng)為浮點(diǎn)計(jì)算,這種運(yùn)算通常伴隨著因?yàn)闊o(wú)法精確表示而進(jìn)行的近似或舍入。
準(zhǔn)確性:由于浮點(diǎn)數(shù)不能表達(dá)所有實(shí)數(shù),浮點(diǎn)運(yùn)算與相應(yīng)的數(shù)學(xué)運(yùn)算有所差異,有時(shí)此差異極為顯著。
—— 摘取自維基百科
相對(duì)定點(diǎn)數(shù)而言,浮點(diǎn)數(shù)是小數(shù)點(diǎn)可變的數(shù),從上述定義可以看出,浮點(diǎn)數(shù)不是精確的值,它的小數(shù)運(yùn)算可能由于丟失精度,往往不是我們所期望的結(jié)果,所以涉及小數(shù)的比較和運(yùn)算要特別小心。
0.2 + 0.4 // 0.6000000000000001
0.6 / 0.1 // 5.999999999999999
(0.3 - 0.2) === (0.2 - 0.1) // false
數(shù)值表示和進(jìn)制
數(shù)字可采用科學(xué)計(jì)數(shù)法表示,使用 e 或 E進(jìn)行縮寫(xiě),如:1.23e2 == 123。
當(dāng) ①小數(shù)點(diǎn)前的數(shù)字多于21位 ②小數(shù)點(diǎn)后的零多于5個(gè),此時(shí)JavaScript會(huì)自動(dòng)數(shù)值轉(zhuǎn)為科學(xué)計(jì)數(shù)法表示。
JavaScript 的整數(shù)有4種字面量表示格式,分別是十進(jìn)制、二進(jìn)制、八進(jìn)制、十六進(jìn)制,而且默認(rèn)情況下,其他進(jìn)制表示的數(shù)值會(huì)自動(dòng)轉(zhuǎn)為十進(jìn)制表示。
- 十進(jìn)制:沒(méi)有前導(dǎo)0或單個(gè)數(shù)值大于7的數(shù)值。
71 // 71
081 // 81
- 二進(jìn)制:有前綴0b或0B的數(shù)值。
0b1001 // 9
0B010 // 2
- 八進(jìn)制:有前綴0o或0O的數(shù)值,或者有前導(dǎo)0、且只用到0-7的八個(gè)阿拉伯?dāng)?shù)字的數(shù)值。
前導(dǎo) 0 表示八進(jìn)制,處理時(shí)很容易造成混亂。ES5 的嚴(yán)格模式和 ES6,已經(jīng)廢除了這種表示法,但是瀏覽器為了兼容以前的代碼,目前還繼續(xù)支持這種表示法。
071 // 57
0o11 // 9
- 十六進(jìn)制:有前綴0x或0X的數(shù)值。
0x11 // 17
0XA1 // 161
特殊數(shù)值
number類(lèi)型包含幾個(gè)特殊數(shù)值,包括 +0、-0、NaN、+Infinity、-Infinity。
NaN表示“非數(shù)字”(Not a Number),一些數(shù)值相關(guān)操作出錯(cuò)時(shí)就會(huì)得到NaN,可通過(guò) !isNaN(xx) 判斷該值是否為有效數(shù)字,還有 typeof NaN == 'number'。
2. string 字符串類(lèi)型
零個(gè)或多個(gè)字符由成對(duì)的單引號(hào)'' 或 雙引號(hào) "" 包裹起來(lái)的形式就是字符串
轉(zhuǎn)義
為什么要轉(zhuǎn)義?
- 字符串的內(nèi)容包含單引號(hào)或雙引號(hào)
- 字符串中表示一些特殊含義的字符,如換行符、制表符等
轉(zhuǎn)義符
轉(zhuǎn)義符以反斜杠(\)開(kāi)頭,用來(lái)表示一些特殊字符。
串。
| 轉(zhuǎn)義符 | 含義 | Unicode 字符值 |
|---|---|---|
| \0 | null | \u0000 |
| \b | Backspace | \u0008 |
| \f | 換頁(yè)符 | \u000C |
| \n | 換行符 | \u000A |
| \r | 回車(chē)鍵 | \u000D |
| \t | 制表符 | \u0009 |
| \v | 垂直制表符 | \u000B |
| ' | 單引號(hào) | \u0027 |
| " | 雙引號(hào) | \u0022 |
| \ | 反斜杠 | \u005C |
多行字符串(一個(gè)字符串分多行書(shū)寫(xiě))
// ① \后不能任何字符,換行后的必須頂格,出錯(cuò)難找,如②
var s = '1234 \
590'
// ② 報(bào)錯(cuò)
var s = '1234 \
590'
// ③ 前兩種都不推薦
var s3 = '1234' +
'590'
// ES6 新增
var s4 = `1234
590` // 包括了輸入的特殊字符 等價(jià)于 "1234 ? 590"
s4.length // 10
3. boolean 布
1)“布爾”的由來(lái):紀(jì)念一位敬業(yè)的邏輯學(xué)家喬治·布爾而得名
2)取值,只有兩個(gè)值:true(真) 和 false(假)
3)&&(邏輯且) 、||(邏輯或) 邏輯操作真值表口訣: a && b 一假必假; a || b 一真必真
4)熟記五個(gè)falsy值:0 null undefined NaN ''或""(空字符串)
4. symbol 符號(hào)
唯一特性:使用Symbol()可以創(chuàng)建一個(gè)全局唯一的值,其類(lèi)型為symbol。
5. null 和 undefined
兩者皆表示什么也沒(méi)有,它們的區(qū)別如下:
1)語(yǔ)法上,如果變量只是聲明沒(méi)賦值,則它默認(rèn)值為 undefined
2)慣例而言,有一個(gè)對(duì)象object,現(xiàn)在還不想賦值,則賦值為 null(一般表示空對(duì)象);有一個(gè)非對(duì)象,還不想給值時(shí),則賦值為 undefined(一般表示空非對(duì)象)。
四、復(fù)雜類(lèi)型(object 對(duì)象)
1. 概述
對(duì)象(object)是最重要的數(shù)據(jù)類(lèi)型。
對(duì)象就是哈希表,即一組“鍵值對(duì)“(key: value)的集合,是一種無(wú)序的復(fù)合數(shù)據(jù)集合。
2. 聲明賦值
var person = {
name: 'Amanda',
age: 22,
married: undefined,
graduate: true,
'good-friends': {
name: 'June'
},
'': null
}
- key: value的形式中key為字符串,value可以是任意七種數(shù)據(jù)類(lèi)型。
- 空串屬于字符串,可以被當(dāng)作對(duì)象數(shù)據(jù)的key。
- 如果key為合法標(biāo)識(shí)符,書(shū)寫(xiě)時(shí),作為字符串標(biāo)識(shí)的引號(hào)可以被省略,但key仍然是字符串。
3. 訪(fǎng)問(wèn)、編輯對(duì)象
兩種訪(fǎng)問(wèn)對(duì)象的方式:(1)變量名[key] (2)變量名.key
var obj = {
code: 0001,
'data-text': 'a box'
}
obj.code // 0001
obj['code'] // 0001
obj['data-text'] // 'a box'
obj.data-text // Uncaught ReferenceError: text is not defined
// 賦值
obj.name = 'div'
obj.name = undefined
'name' in obj // true
delete obj.name // 刪除obj.name屬性
'name' in obj // false
Object.keys(obj) // ["code", "data-text"]
由上可知,變量名[key] 屬于通用方法,只有當(dāng)key滿(mǎn)足合法標(biāo)識(shí)符時(shí),才能使用 變量名.key 訪(fǎng)問(wèn)。
- 通過(guò) delete命令 刪除對(duì)象屬性
- in 操作符判斷對(duì)象中是否存在這個(gè)key
- Object.keys 方法獲取一個(gè)對(duì)象所有的key