2015年12月10日 星期四

JavaScript 中的 typeof 介紹

typeof運算子返回一個字串,表示未經求值的操作數(unevaluated operand)的類型。
語法

typeof operand

參數

operand 是一個表達式,表示物件或原始值,其類型被返回。
描述

此表總結了 typeof 可能的返回值。更多有關類型和原始值的訊息,可查看 JavaScript資料結構 頁面。
類型     結構
Undefined     "undefined"
Null     "object" (見下方)
布爾值     "boolean"
數值     "number"
字串     "string"
Symbol (ECMAScript 6 新增)     "symbol"
宿主物件(JS環境提供的,比如瀏覽器)     Implementation-dependent
函式物件 (implements [[Call]] in ECMA-262 terms)     "function"
任何其他物件     "object"

例子
常規用法

// Numbers
typeof 37 === 'number';
typeof 3.14 === 'number';
typeof Math.LN2 === 'number';
typeof Infinity === 'number';
typeof NaN === 'number'; // 儘管NaN是"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'; // 不要這樣使用!

// Symbols
typeof Symbol() === 'symbol';
typeof Symbol('foo') === 'symbol';
typeof Symbol.iterator === 'symbol';

// Undefined
typeof undefined === 'undefined';
typeof blabla === 'undefined'; // 一個未定義的變數,或者一個定義了卻未賦初值的變數

// Objects
typeof {a:1} === 'object';

// 使用Array.isArray或者Object.prototype.toString.call方法可以從基本的物件中區分出陣列類型
typeof [1, 2, 4] === 'object';

typeof new Date() === 'object';

// 下面的容易令人迷惑,不要這樣使用!
typeof new Boolean(true) === 'object';
typeof new Number(1) ==== 'object';
typeof new String("abc") === 'object';

// 函式
typeof function(){} === 'function';
typeof Math.sin === 'function';

null

// 從JavaScript一開始出現就是這樣的
typeof null === 'object';

在 JavaScript 最初的實現中,JavaScript 中的值是由一個表示類型的標籤和實際資料值表示的。物件的類型標籤是0。由於 null 代表的是空指針(大多數平台下值為0x00),因此,null的類型標籤也成為了0,typeof null就錯誤的返回了"object".(reference)

該現象有待於在ECMAScript 6中被修復 (該提議已被否決). 正確的返回值將成為 typeof null === 'null'.
正則表達式

對正則表達式字面量的類型判斷在某些瀏覽器中不符合標準:

typeof /s/ === 'function'; // Chrome 1-12 , 不符合 ECMAScript 5.1
typeof /s/ === 'object'; // Firefox 5+ , 符合 ECMAScript 5.1

沒有留言:

張貼留言