说到js的类型判断很容易想到的是 typeof、instanceof等。
typeof 有个缺点就是引用类型的结果值都是object
所以就要说一下这些类型是怎么判断的。在说类型判断之前先介绍个东西 Object.prototype.toString 可以查看链接
翻译过来就是
当 toString 方法被调用的时候,下面的步骤会被执行:
- 如果 this 值是 undefined,就返回 [object Undefined]
- 如果 this 的值是 null,就返回 [object Null]
- 让 O 成为 ToObject(this) 的结果
- 让 class 成为 O 的内部属性 [[Class]] 的值
- 最后返回由 "[object " 和 class 和 "]" 三个部分组成的字符串
console.log(Object.prototype.toString.call(undefined)) // [object Undefined]
console.log(Object.prototype.toString.call(null)) // [object Null]var date = new Date();
console.log(Object.prototype.toString.call(date)) // [object Date]
所以就可以根据这个方法来判断具体是什么类型。
下面写一个jQuery源码里面使用的场景,下面是剪切了三个片段。
在jQuery里面的使用情况是下面这种情况。
所以根据jQuery源码,可以单独写一个判断类型的函数。
var class2type = {};"Boolean Number String Function Array Date RegExp Object Error".split(" ").map(function(item, index) {class2type["[object " + item + "]"] = item.toLowerCase();
})function type(obj) {if (obj == null) {return obj + "";}return typeof obj === "object" || typeof obj === "function" ?class2type[Object.prototype.toString.call(obj)] || "object" :typeof obj;
}