概述
JavaScript 标准文档只给出了一种获取 [[Class]]
值的方法,那就是使用 Object.prototype.toString
。
JavaScript 类型表格
Value Class Type
-------------------------------------
"foo" String string
new String("foo") String object
1.2 Number number
new Number(1.2) Number object
true Boolean boolean
new Boolean(true) Boolean object
new Date() Date object
new Error() Error object
[1,2,3] Array object
new Array(1, 2, 3) Array object
new Function("") Function function
/abc/g RegExp object (function in Nitro/V8)
new RegExp("meow") RegExp object (function in Nitro/V8)
{} Object object
new Object() Object object
上面表格中,Type 一列表示 typeof
操作符的运算结果。可以看到,这个值在大多数情况下都返回 "object"。
Class 一列表示对象的内部属性 [[Class]]
的值。
为了获取对象的 [[Class]]
,我们需要使用定义在 Object.prototype
上的方法 toString
。
类型
基本类型
基本类型 | 返回值 |
---|---|
Boolean | "[object Boolean]" |
Number | "[object Number]" |
String | "[object String]" |
Undefined | "[object Undefined]" |
Null | "[object Null]" |
Symbol | "[object Symbol]" |
Object.prototype.toString.call(true) === "[object Boolean]"
Object.prototype.toString.call(1) === "[object Number]"
Object.prototype.toString.call("a") === "[object String]"
Object.prototype.toString.call(undefined) === "[object Undefined]"
Object.prototype.toString.call(null) === "[object Null]"
Object.prototype.toString.call(Symbol()) === "[object Symbol]"
引用类型
引用类型 | 返回值 |
---|---|
Function | "[object Function]" |
Array | "[object Array]" |
Date | "[object Date]" |
RegExp | "[object RegExp]" |
Object | "[object Object]" |
Object.prototype.toString.call(function(){}) === "[object Function]"
Object.prototype.toString.call([]) === "[object Array]"
Object.prototype.toString.call(new Date()) === "[object Date]"
Object.prototype.toString.call(new RegExp('^http://')) === "[object RegExp]"
Object.prototype.toString.call({}) === "[object Object]"
使用
function is(type, obj) {
var clas = Object.prototype.toString.call(obj).slice(8, -1);
return obj !== undefined && obj !== null && clas === type;
}
is('String', 'test'); // true
is('String', new String('test')); // true
上面例子中,Object.prototype.toString
方法被调用,this 被设置为了需要获取 [[Class]]
值的对象。
Object.prototype.toString
返回一种标准格式字符串,所以上例可以通过 slice
截取指定位置的字符串,如下所示:
Object.prototype.toString.call([]) // "[object Array]"
Object.prototype.toString.call({}) // "[object Object]"
Object.prototype.toString.call(2) // "[object Number]"
结论
为了检测一个对象的类型,强烈推荐使用 Object.prototype.toString
方法; 因为这是唯一一个可依赖的方式。正如上面表格所示,typeof
的一些返回值在标准文档中并未定义, 因此不同的引擎实现可能不同。