89-js-5-Object.prototype.toString方法

概述

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 的一些返回值在标准文档中并未定义, 因此不同的引擎实现可能不同。

转载

Object.prototype.toString