typeof

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since July 2015.

摘要

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

參照