typeof

概述

typeof操作符返回一个字符串,代表一个未估值的操作数(unevaluated operand)的类型.

Operator
Implemented in: JavaScript 1.1
ECMA Version: ECMA-262 (and ECMA-357 for E4X objects)

语法

typeof操作符有下面两种用法:

  1. typeof 操作数
  2. typeof (操作数)

参数

操作数可以是一个字符串,或者变量,关键字,对象等. 括号是可有可无的.

描述

此表总结了typeof所有可能的返回值:

操作数类型 返回值
undefined "undefined"
Null "object"
Boolean "boolean"
Number "number"
String "string"
宿主对象(JS引擎内置对象,而不是DOM或者其他提供的) 由具体实现而定
函数对象(在ECMA-262术语中,指的是实现了[[Call]] 的对象) "function"
E4X XML 对象 "xml"
E4X XMLList 对象 "xml"
其他对象 "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'; // 不要这样使用!

// Undefined
typeof undefined === 'undefined';
typeof blabla === '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

typeof null === 'object'; // 从JavaScript诞生以来,一直是这样的.

在JavaScript最初的实现中,JavaScript中的值是由一个类型标签和一个数值组成的,对象的类型标签是0,由于null代表的是空指针(大多数平台下值为0x00),因此,null的类型标签也成为了0,typeof null就错误的返回了"object".(该段文字没有具体的出处,正确性有待考证)

该现象有待于在ECMAScript 6中被修复 (该提议已被否决). 正确的返回值将成为 typeof null === 'null'.

正则表达式

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

其他的怪异现象

在旧版本IE 6/7/8中,typeof alert === 'object'

规范

ECMA-262 section 11.4.3

Document Tags and Contributors

Contributors to this page: ziyunfei, ethertank
最后编辑者: ziyunfei,