JavaScript - 資料型別

jsummer發表於2019-03-25

資料型別

JavaScript規定了7種語言型別。根據最新的ECMAScript規範,這7種型別是:

  1. Undefined
  2. Null
  3. Boolean
  4. String
  5. Number
  6. Symbol
  7. 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表示希臘字元∑。

字元編碼筆記: ASCII,Unicode和UTF8

// 練習題
var text = "This is comma: \u002C.";
text.length;  // 17

var text = "This is comma: ,.";
text.length;  // ?
複製程式碼

字串的特點

JavaScript中的字串是不可變的,一旦字串被建立,就無法改變,所以字串具有值型別的特徵。

var lang = 'java';
lang = lang + 'script';
複製程式碼

步驟如下:

  1. 宣告lang變數,建立一個長度為4的字串,然後把'java'賦值給lang
  2. 建立一個長度為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中,物件的定義是“屬性的集合”。當你宣告一個物件時,它會自動初始化一組屬性。

image.png

這些屬性還可以被增減,屬性的值可以是任意型別,包括具有複雜結構的物件。屬性用鍵來標識,它的鍵值可以使一個字串或者Symbol。

var obj = { name: 'jack' };
delete obj.name;
'name' in obj // false
複製程式碼

參考

相關文章