正确的检测对象类型 Object.prototype.toString

使用typeof

使用typeof会有一个问题,就是nullArray得到的结果也是object,所以我们需要判断一个变量是否是对象就应该用到Object.prototype.toString

检测纯粹的object对象

1
2
3
4
5
6
7
8
9
10
11

console.log(Object.prototype.toString.call("jerry"));//[object String]
console.log(Object.prototype.toString.call(12));//[object Number]
console.log(Object.prototype.toString.call(true));//[object Boolean]
console.log(Object.prototype.toString.call(undefined));//[object Undefined]
console.log(Object.prototype.toString.call(null));//[object Null]
console.log(Object.prototype.toString.call({name: "jerry"}));//[object Object]
console.log(Object.prototype.toString.call(function(){}));//[object Function]
console.log(Object.prototype.toString.call([]));//[object Array]
console.log(Object.prototype.toString.call(new Date));//[object Date]
console.log(Object.prototype.toString.call(/\d/));//[object RegExp]

示例代码如下:

1
2
3
function isObject(obj) {
return Object.prototype.toString.call(obj) === '[object Object]';
}

不过这种方式无法区分自定义对象类型,自定义类型需要采用instanceOf,如

1
2
function Person(){};
isObject(new Person()); //结果为true

为什么不用obj.toString()

1
2
3
4
5
6
console.log("jerry".toString());//jerry
console.log((1).toString());//1
console.log([1,2].toString());//1,2
console.log(new Date().toString());//Wed Dec 21 2016 20:35:48 GMT+0800 (中国标准时间)
console.log(function(){}.toString());//function (){}
console.log(null.toString());//error

因为toString使用Object的原型方法,而Array等类型作为Object的实例都重写了toString方法。

Partager