資料型別
JavaScript規定了7種語言型別。根據最新的ECMAScript規範,這7種型別是:
- Undefined
- Null
- Boolean
- String
- Number
- Symbol
- Object
前6中資料型別屬於簡單資料型別(基本資料型別/原始資料型別),只有Object屬於複雜資料型別。
typeof
我詳情介紹資料型別之前,我們要了解一下typeof操作符,它可以用來檢測資料型別。
typeof操作符返回一個字串,表示運算元型別。
typeof | 執行時型別 |
---|---|
object | Null |
object | Object |
function | Object |
number | Number |
string | String |
boolean | Boolean |
undefined | Undefined |
symbol | Symbol |
typeof 123 // 'number'
typeof '123' // 'string'
複製程式碼
Undefined
Undefined 型別表示未定義(已宣告,未初始化),它只有一個值,即 undefined
。任意變數在未賦值之前都是 Undefined型別,值為 undefined
。
var a;
a === undefined; // true
typeof a === 'undefined'; // true
複製程式碼
Null
Null 型別表示空值(已宣告,初始化為null),它只有一個值,即 null
。
與 undefined
不同,null
是JavaScript的關鍵字。
var a = null;
a === null; // true
typeof a === 'object' // true
複製程式碼
Boolean
Boolean型別表示邏輯意義上的真和假,它有兩個值,true和false。
var a = true;
a === true; // true
typeof a === 'boolean'; // true
複製程式碼
下表為各種資料型別轉換為Boolean的規則
資料型別 | 轉換為true的值 | 轉換為false的值 |
---|---|---|
Boolean | true | false |
String | 任何非空字串 | ""(空字串) |
Number | 任何非零數字值(包括無窮大) | 0和NaN |
Object | 任何物件 | null |
Undefined | n/a | undefined |
Symbol | Symbol | n/a |
String
String型別表示文字資料。
String型別用於表示由16位Unicode字元組成的字元序列。 現行的字符集國際標準,字元是以Unicode的方式表示的,每一個Unicode的碼點表示一個字元,理論上,Unicode的範圍是無限的。UTF是Unicode的編碼方式,規定了碼點在計算機中表示方法,常見的有UTF16和UTF8。Unicode的碼點通常是用 U+???來表示,其中???是十六進位制的碼點值。0-65536(U+0000 - U+FFFF)的碼點被稱為基本字元區域(BMP)。
字元字面量
String型別包含一些特殊的字元字面量,也叫轉義序列。每個轉義序列被作為一個字元來解析。
字面量 | 含義 |
---|---|
\n | 換行 |
\t | 製表 |
\b | 空格 |
\r | 回車 |
\f | 進紙 |
\ | 斜槓 |
' | 單引號('),在用單引號表示的字串中使用。例如: 'He said, 'Hey'' |
" | 雙引號('),在用雙引號表示的字串中使用。例如: 'He said, 'Hey'' |
\x nn | 以十六進位制程式碼nn表示的一個字元(其中n為0~F)。例如:\x41 表示"A" |
\u nnnn | 以十六進位制程式碼nnnn表示一個Unicode字元(其中n為0~F)。例如:\u03a3表示希臘字元∑。 |
// 練習題
var text = "This is comma: \u002C.";
text.length; // 17
var text = "This is comma: ,.";
text.length; // ?
複製程式碼
字串的特點
JavaScript中的字串是不可變的,一旦字串被建立,就無法改變,所以字串具有值型別的特徵。
var lang = 'java';
lang = lang + 'script';
複製程式碼
步驟如下:
- 宣告lang變數,建立一個長度為4的字串,然後把'java'賦值給lang
- 建立一個長度為10的字串,然後把'javascript'賦值給lang,銷燬 'java' 和 'script'
Number
Number型別表示數字,它使用IEEE754格式來表示整數和浮點數。
IEEE754: 二進位制浮點數算術標準。
整數
我們經常用到是十進位制的整數,那麼除了十進位制外,還可以通過八進位制、十六進位制來表示整數。
var num10 = 10; // 十進位制 10
var num8 = 012; // 八進位制 10
var num16 = 0xA; // 十六進位制 10
num10 + num8 + num16 // ?
複製程式碼
在進行算術計算時,結果都會轉換為十進位制數值。
浮點數
浮點數即我們通常用到的小數。
0.1 + 0.2 === 0.3 // ?
複製程式碼
這裡輸出的結果是false,說明兩邊不相等,這是浮點運算的特點,只要基於IEEE754格式實現的語言都會有這個毛病。
所以,正確比較的方式是使用JavaScript提供的最小精度值來比較
Math.abs(0.1 + 0.2 - 0.3) <= Number.EPSILON; // true
複製程式碼
還可以使用第三方外掛實現,比如: bignumber.js
var x = new BigNumber(0.1);
x.plus(0.2).toNumber() === 0.3 // true
複製程式碼
數值範圍
Number能夠表示數值範圍是,
Number.MIN_VALUE; // 5e-324
Number.MAX_VALUE; // 1.7976931348623157e+308
複製程式碼
超出這個範圍的值,將會自動轉為特殊的 Infinity 值。Infinity為正無窮,-Infinity為負無窮。
1 / +0 // Infinity
1 / -0 // -Infinity
複製程式碼
這裡需要注意一點,在JavaScript中有 +0 和 -0,區分他們方式就是檢測 1 / x 的結果是 Infinity 還是 -Infinity。
NaN
顧名思義,NaN 即 Not a Number,它是一個特殊的數值,這個數值用於表示一個本來要返回數值的運算元未返回數值的情況(這樣就不會拋錯誤了)。
1 / 'qwe'; // NaN
複製程式碼
任何涉及到NaN的操作都會返回NaN,而且NaN與任何值都不相等,包括它自己。
NaN / 10 // NaN
NaN === NaN // false
複製程式碼
JavaScript提供了一個方法 isNaN,它接受一個引數,可以檢測這個引數是否“不是數值”。
isNaN(NaN) // true
isNaN(10) // false
isNaN('yweg') // true
isNaN('10') // false
複製程式碼
Symbol
Symbol是ES6中引入的新型別,表示獨一無二的值,它的出現使物件的屬性名可以使用兩種型別,一個是String,一個是Symbol。凡是屬性名是Symbol型別的,可以保證與其它屬性名不會產生衝突。
Object
Object是JavaScript中最複雜的型別,也是JavaScript的核心機制之一。Object表示物件的意思,既表示客觀世界中的某個具體的事物,又表示軟體系統中的基本元素。
在電腦科學中,物件是指記憶體中的可以被識別符號引用的一塊區域。
在JavaScript中,物件的定義是“屬性的集合”。當你宣告一個物件時,它會自動初始化一組屬性。
這些屬性還可以被增減,屬性的值可以是任意型別,包括具有複雜結構的物件。屬性用鍵來標識,它的鍵值可以使一個字串或者Symbol。
var obj = { name: 'jack' };
delete obj.name;
'name' in obj // false
複製程式碼
參考
- 《JavaScript高階程式設計(第3版)》
- 《重學前端-極客時間》
- ECMAScript6入門-Symbol
- BigNumber.js
- JavaScript資料結構和資料型別