typeof

摘要

typeof 運算子會傳回一個字串值, 指出未經運算 (unevaluated) 的運算元所代表的型別。

運算子
實作於: JavaScript 1.1
ECMA 版本: ECMA-262 (以及 ECMA-357 for E4X objects)

語法

typeof 之後面跟著它的唯一運算元:

typeof operand

參數

operand 表示式代表傳入的物件或原始型別。

說明

下表摘要列出了 typeof 可能的傳回值:

型別 傳回
Undefined "undefined"
Null "object"
Boolean "boolean"
Number "number"
String "string"
主機端物件 (由 JS 執行環境提供) 視實作方式而異
Function 物件 (實作 ECMA-262 所定義的 [[Call]]) "function"
E4X XML 物件 "xml"
E4X XMLList 物件 "xml"
所有其它物件 "object"

範例

一般情況

js
// Numbers
typeof 37 === "number";
typeof 3.14 === "number";
typeof Math.LN2 === "number";
typeof Infinity === "number";
typeof NaN === "number"; // 雖然是 "Not-A-Number"
typeof Number(1) === "number"; // 但是不要使用這種方式!

// Strings
typeof "" === "string";
typeof "bla" === "string";
typeof typeof 1 === "string"; // typeof 一律會傳回一個字串
typeof String("abc") === "string"; // 但是不要使用這種方式!

// Booleans
typeof true === "boolean";
typeof false === "boolean";
typeof Boolean(true) === "boolean"; // 但是不要使用這種方式!

// Undefined
typeof undefined === "undefined";
typeof blabla === "undefined"; // 一個 undefined 變數

// Objects
typeof { a: 1 } === "object";
typeof [1, 2, 4] === "object"; // 請使用 Array.isArray 或者 Object.prototype.toString.call 以區分正規運算式和陣列
typeof new Date() === "object";

typeof new Boolean(true) === "object"; // 這樣會令人混淆。不要這樣用!
typeof new Number(1) === "object"; // 這樣會令人混淆。不要這樣用!
typeof new String("abc") === "object"; // 這樣會令人混淆。不要這樣用!

// Functions
typeof function () {} === "function";
typeof Math.sin === "function";

null

js
typeof null === "object"; // 自從有 JavaScript 開始就是這樣了

自從 JavaScript 一開始出現, JavaScript 的值就總以型別標簽跟著一個值的方式表示。物件的型別標簽是 0. 而 null 這個值是使用 NULL 指標 (在大部份平台上是 0x00) 來表示. 因此, null 看起來像是一個以 0 為型別標簽的值, 並使得 typeof 傳回不甚正確的結果. (參考來源)

這個問題已計畫在下一版 ECMAScript 予以修正 (會以 opt-in 方式提供). 屆時它將會做出如 typeof null === 'null' 的正確回傳結果。

備註: 此修正計畫已被拒絕

正規表示式 (Regular expressions)

可呼叫的正規表示式在某些瀏覽器上面必須借助非正式插件 (need reference to say which).

js
typeof /s/ === "function"; // Chrome 1-12 ... // 不符合 ECMAScript 5.1 (譯註: 在新版 Chrome 已修正為 'object')
typeof /s/ === "object"; // Firefox 5+ ...    // 符合 ECMAScript 5.1

其它怪異輸入 (quirks)

舊版 Internet Explorer 請留意 alert 函數

在 IE 6, 7 和 8, typeof alert === 'object'

備註: 這並不怪異。這是實情。在許多較舊的 IE 中, 主機端物件的確是物件, 而非函數

規範

Specification
ECMAScript Language Specification
# sec-typeof-operator

參照