JavaScript 教學 - 資料型態 (Data Type) - 上
介紹 JavaScript 中的資料型態 (型別),包含布林 (Boolean)、數值 (Number) 和字串 (String),以及轉型的方法。
簡介
型別的種類
在 JavaScript 中有八種主要的型別:
三種基本型別:
- 布林 (Boolean)
- 數值 (Number)
- 字串 (String)
兩種複合的型別:
- 陣列 (Array)
- 物件 (Object)
兩種簡單型別:
- 空值 (null)
- 未定義 (undefined)
一種特殊型別:
- 函式 (Function)
動態型別
JavaScript 是一種動態型別語言 (Dynamic typed language),可以不需要特別的宣告,例如:
1 | var num = 123; |
不需要特別轉型。JavaScript 具有自動型態轉換的特性,在大多數的時候交由 JavaScript 自動轉型即可。
型別的判斷
可以用 typeof
操作子來取得變數的型別,也可以用 typeof()
類似函式的寫法 (實際上是括號運算子,由於運算子優先序問題,建議使用這個方式):
1 | console.log(typeof(true)); // boolean |
物件類別
布林、數值和字串三種基本型別都有個別對應到一個物件類別,透過該物件類別包裝後,可以進行函式操作,例如字串物件可使用 substr()
等函式。可以透過下面的方式將型別包裝成物件與操作:
1 | var b = new Boolean(false); |
實際上使用物件函式並不需要自己手動轉換,JavaScript 會自動處理:
1 | var s = 'friend'; |
實務上應該交由 JavaScript 來處理,不建議包裝成物件類別的用法。
布林 (Boolean)
語法
布林的值只有兩種,true
或 false
,只能是小寫。
1 | var flag = false; |
轉型
基本上 JavaScript 不需要特別去轉型,但如果需要特別轉型也是有辦法,布林可以用以下方法轉型
- 利用
Boolean()
函式轉型。 - 利用
!!
轉型,原理是利用!運算子自動轉型為相反的布林值後,在反轉回來。
1 | var flag = document.documentElement; // 確認是否有此成員 |
總結來說,以下情況轉為布林時,結果會是 false
:
- Boolean 型別值為 FALSE 之變數。
- Number 型別值為 0 之變數。
- Number 型別值為 NaN 之變數。
- String 為空字串之變數。
- undefined
- null
數值 (Number)
語法
在 JavaScript 中的數字型別只有一種,所以可以把它想成自動判斷整數或浮點數,從整數的角度來看他的話可以有以下三種寫法:
- 十進位制。
- 十六進位制,以
0x
開頭。 - 八進位制,以
0
開頭。(八進位制並未定義在標準之中,僅在附錄的相容性章節。)
從浮點數來看的話,可以寫成科學記號的表示方式。
1 | console.log(123); // 123 |
所以總結正規表示法如下:
1 | integer : [1-9][0-9]* |
正負號並不屬於實字的語法中,而是運算子的一部份。
數值的範圍
JavaScript 使用 64 位元浮點數來表示數字,所以整數部分介於 -9007199254740992(-253) 到 9007199254740992(253) 可以精確表示出來,浮點數格式則是最大 ±1.7976931348623157 x 10308 最小 ±5 x 10-324。
可使用 JavaScript 的常數 Number.MAX_VALUE
取得可表示的最大數字部分 (次方數最大) 和 Number.MIN_VALUE
取得可表示的最小數字部分 (次方數最小,趨近零)。
1 | console.log(Number.MAX_VALUE); // 1.7976931348623157e+308 |
特殊數值
NaN
NaN 表示 Not a number,當運算錯誤時就會得到這個結果,例如無法轉成數值的運算或除以0等情況。必須注意的一點是,NaN 只能使用 isNaN()
的函式來判斷是否為 NaN 的數值:
1 | // NaN |
正無窮大
當一個數值大於可表示的最大值時,JavaScript 會使用 Infinity
的特殊數值來表示正無窮大。
1 | console.log(Number.MAX_VALUE + 1e+291); // 1.7976931348623157e+308,表示位數數值沒有增加,所以沒有變化 |
負無窮大
相反的,當一個數值小於可表示的最小值時,JavaScript 會使用 -Infinity
的特殊數值來表示負無窮大。
1 | console.log(-Number.MAX_VALUE - 1e+291); // -1.7976931348623157e+308,表示位數數值沒有增加,所以沒有變化 |
轉型
數值可以用以下方式轉型:
- 利用
Number()
函式轉型。 - 利用
value - 0
轉型。原理是利用-運算子自動轉型,再減去一個不影響結果的數值。
1 | var num = Number('123'); |
除此之外,另外還有 parseInt()
和 parseFloat()
兩種函式可以將字串解析成數字,這兩個函式會由左至右解析數字的部分,直到遇到非數字的部分;而 parseInt()
只處理整數部分,另外 parseInt()
和上面轉型的方式也可以解析十六進位的字串。包含上述的轉型都允許開頭或結尾有空白。
1 | console.log(parseInt('169.99cm')); // 169 |
如果字串確定是數字形式的時候,parseInt()
和 parseFloat()
也可以視為額外的轉型方法。
近似值
在電腦世界中的浮點數其實只是近似值,浮點數中的整數可能只是精確度到達一定程度而已,例如下面的例子:
1 | console.log(Number.MIN_VALUE / 10); // 0 |
另外有些情況雖然看起來很正常,但仍然會得到錯誤的結果,如下面的些例子與一個變通的方法:
1 | var num = 8; |
字串 (String)
語法
字串有以下兩種使用方式:
- 單引號。
- 雙引號。
單引號字串中可以直接使用雙引號;反之亦然。字串實字不能直接斷行寫成多行,必須用運算子連接。一些範例如下:
1 | console.log("I'm fine."); // I'm fine. |
最後一個範例是一種非標準的寫法,請避免使用。
逸出字元
所謂逸出字元是為了某些特別的用途或能以此輸入打不出來的字,而定義的一種使用方式,在此的逸出字元以反斜線 (backslash) 開頭。例如,我們使用單引號做包夾,但字串中如果出現單引號,將會誤判為字串結束單引號,所以使用 \'
來表示字串中的單引號。使用字串可用的逸出字元如下:
符號 | 說明 |
---|---|
\b | 倒退鍵 (0x08)。 |
\t | 水平定位字元 (0x09)。 |
\n | 換行字元 (0x0A)。 |
\v | 垂直定位字元 (0x0B)。 |
\f | 跳頁字元 (0x0C)。 |
\r | 歸位字元 (0x0D)。 |
" | 雙引號字元 (0x22)。 |
' | 單引號字元 (0x27)。 |
\ | 反斜線字元 (0x5C)。 |
\xXX or \x[0-9A-Fa-f]{2} | 以兩位數十六進位數字表示 Latin-1 字元。 |
\uXXXX or \u[0-9A-Fa-f]{4} | 以四位數十六進位數字表示 Unicode 字元。 |
\XXX or [0-7]{1,3} | 以一到三位八進位數字表示 Latin-1 字元。(八進位制並未定義在標準之中。) |
範例如下:
1 | console.log('I can\'t type \u5566'); // I can't type 啦 |
字串的操作
字串的連接
JavaScript中,字串使用加號 (+
) 來作為連接運算子。
1 | console.log('abc' + 'def'); // abcdef |
字串的長度
可以使用 length
屬性取得字串的長度。
1 | console.log('abcdef'.length); // 6 |
字元的存取
JavaScript 中字串的字元是唯讀的,不能直接修改,但我們可以用以下方式讀取字串中的字元:
- 使用
charAt()
函式。 - 使用
[]
陣列索引方式。(在 ECMAScript v5 才有,較舊的瀏覽器如 IE7 並不支援。)
一些範例如下:
1 | var s = 'Loser'; |
轉型
字串可以用以下方式轉型:
- 利用
String()
函式轉型。 - 利用
toString()
函式轉型。 - 利用
value + ''
轉型。原理是利用+
運算子自動轉型,再加上空字串。
1 | var str = String(true); |
當 null
或 undefined
的時候無法使用 toString()
。
延伸閱讀
上一篇 JavaScript 教學 - 基本語法 (Syntax)
下一篇 JavaScript 教學 - 資料型態 (Data Type) - 下