在 JavaScript 中,有基本(Primitive)資料型態、複合(Composite)資料型態,還有兩個特殊的值
null
與 undefined
。基本資料型態包括了數值、字串與布林值,型態名稱分別為
number
、string
與布林值 boolean
。在 JavaScript 中,沒有整數與浮點數的區別,數值都是 〈IEEE 754 標準 64 位元浮點數〉,可表示的數字最小值為
Number.MIN_VALUE
(5e-324),而最大值為 Number.MAX_VALUE
(1.7976931348623157e+308)。根據 〈ECMA Section 8.5 - Numbers〉,最大整數應為 2^53,不過注意位元運算子的結果會是 32 位元有號整數,像是 ~
、>>
等。與其他程式語言相同,撰寫數值時要使用數值實字(Number literal),預設是十進位整數,也可以用 0 開頭表示八進位整數,或是用 0x 開頭表示十六進位整數。例如:
10(十進位)
0677(八進位)
0xFF(十六進位)
不過在 ECMAScript 5 的嚴格模式(Strict mode)下,不允許八進位表示法,因此執行以下的 .js 檔案將會有 SyntaxError
:
'use strict';
var x = 0677;
若要表示浮點數,則可使用科學記號表示。例如:
3.14
5.231E13(5.231 * 1013)
1.31E-32(1.31 * 10-32)
數值有幾個特殊值,例如 +Infinity
(或簡單寫為 Infinity
)表示正無限大,-Infinity
表示負無限大。也可以使用 Number.POSITIVE_INFINITY
取得正無限大,Number.NEGATIVE_INFINITY
取得負無限大。另外還有 NaN
或 Number.NaN
表非數值(Not a Number),例如你嘗試作 1 / 'two'
時,就會出現 NaN
的結果。注意,
NaN
不等於任何值,NaN
也不等於 NaN
,如果你要測試某值結果是否為 NaN
,方法之一可以用 isNaN
函式來測試。例如:
> NaN === NaN;
false
> isNaN(NaN);
true
> isNaN(1 / 'two');
true
>
不過,isNaN
不可靠,如果傳入的數值是 NaN
確實會是 true
,然而,無法自動型態轉換至數字的值,都會讓 isNaN
的結果為 true
,像是非數字格式且非空的字串、undefined
等。例如:
> isNaN('caterpillar');
true
> isNaN(undefined);
true
> isNaN('0');
false
>
所以,isNaN
比較像是測試,將傳給它的值做型態轉換後是否為「Not a Number」,也就是判斷值是不是可以型態轉換為數字,如果想測試某值是不是 NaN
,最好自行撰寫,還好,因為 NaN
是 JavaScript 中唯一自身不等於自身的值,所以可以自己定義一個 isRealNaN
函式:
function isRealNaN(value) {
return value !== value;
}
console.log(isRealNaN(NaN)); // true
console.log(isRealNaN('caterpillar')); // false
console.log(isRealNaN(undefined)); // false
問題並不會這麼結束,雖然 NaN
代表「Not a Number」,不過,typeof NaN
的結果卻是 'number'
,這實在很囧:
> typeof NaN;
'number'
>
當然,在 JavaScript 中,typeof
本身就有些問題,不過,如果你想要檢查值是不是一個有限數字,可以借助 isFinite
函式,它對 NaN
與 Infinity
測試的結果會是 false
,不過,isFinite
同樣會嘗試做型態轉換,再檢查轉換後的值,因此,可以自己定義一個 isRealFiniteNumber
函式:
function isRealFiniteNumber(value) {
return typeof value === 'number' && isFinite(value);
}
console.log(isRealFiniteNumber(NaN)); // false
console.log(isRealFiniteNumber(Infinity)); // false
console.log(isRealFiniteNumber('93')); // false
console.log(isRealFiniteNumber(93)); // true
在 JavaScript 中,字串是基本資料型態,可使用單引號或雙引號來包括一串文字,用以表示字串。例如:
var str1 = 'text1';
var str2 = "text2";
JavaScript 中沒有字元型態,以單引號或雙引號來包括單一字元,都是字串型態。例如:
> typeof 'A';
'string'
> typeof "B";
'string'
>
typeof
可以用來測試某資料的型態,會傳回型態的字串描述,例如,對數值使用 typeof
會傳回 'number'
。對字串使用則傳回是 'string'
。在撰寫字串實字(String literal)時可使用單引號或雙引號,一般習慣在 JavaScript 程式中採用單引號,而將雙引號保留給 HTML 使用,避免跳脫文字的麻煩。例如:
var html = '<input type="text" value="defalut">';
布林值只有兩個值,true
與 false
,分別表示真與假,對布林值使用 typeof
,結果會是 'boolean'
。複合資料型態就是指物件(object),基本上它們都是
Object
的實例,使用 typeof
測試複合資料型態的結果就是 'object'
。例如:
> typeof new Object();
'object'
> typeof {};
'object'
> typeof [];
'object'
>
[]
建立一個陣列,也就是一個 Array
實例,它當然是一個物件,因此 typeof []
的結果就是 'object'
。null
是 JavaScript 中特殊的值,表示沒有任何東西。應用的時機就是在變數不參考至任何物件時,可以指定變數為 null
,或測試變數是否參考至 null
:
> var x = null;
undefined
> x === null;
true
>
如果你想知道某個物件是哪個型態的實例,可以使用 instanceof
來測試。例如:
> var x1 = {};
undefined
> var x2 = [];
undefined
> x1 instanceof Object;
true
> x2 instanceof Object;
true
> x1 instanceof Array;
false
> x2 instanceof Array;
true
>
對 null
使用 typeof
的結果會是 'object'
,這很怪(只能強記),因為用 instanceof
測試 null
是否為 Object
的實例,結果卻是 false
:
> typeof null;
'object'
> null instanceof Object;
false
>
注意!以下的 x
值有參考至一個值,那就是 null
,而不是 undefined
:
var x = null;
以下的 x
才是 undefined
:
var x;
undefined
是 JavaScript 中特殊的值,當你試圖取得某個沒指定任何值的變數(也沒指定 null
)或特性(Properties)時,就會出現 undefined
的結果。對 undefined
使用 typeof
的結果是 'undefined'
。在 Node.js 中,undefined
會顯示 undefined。 (在 Rhino Shell 中,
undefined
不會顯示任何結果,因此,你在 〈資料型態〉中看到的 Rhino Shell 示範,若是執行結果為 undefined
時,就只是單純換下一行而不顯示任何東西。) 注意,別與直譯錯誤時出現的「未定義」訊息搞錯了,例如,以下的示範中,並沒有事先宣告
x
,因此 x
未定義,會發生 ReferenceError
的錯誤:
> var y = x;
ReferenceError: x is not defined
at repl:1:9
at REPLServer.self.eval (repl.js:110:21)
at repl.js:249:20
at REPLServer.self.eval (repl.js:122:7)
at Interface.<anonymous> (repl.js:239:12)
at Interface.EventEmitter.emit (events.js:95:17)
at Interface._onLine (readline.js:202:10)
at Interface._line (readline.js:531:8)
at Interface._ttyWrite (readline.js:760:14)
at ReadStream.onkeypress (readline.js:99:10)
>
如果是以下的程式,是可以正確執行的程式碼,x
與 y
的結果都是 undefined
:
> var x;
undefined
> var y = x;
undefined
> x
undefined
> y
undefined
>
undefined
本身等於 undefined
:
> undefined === undefined;
true
>