何大小成

对象 · 类 · 之间的判断

判断一个对象是否属于某各类?

这个问题好熟悉,似乎很多人第一时间想到instanceOf,可是它在Array和Object之间判断就很不准确了:

所以在这里介绍两种方法:

  1. object.constructor
  2. Object.prototype.toString.call(obj)

object.constructor

object.constructor :返回创建实例对象的 Object 构造函数的引用。

这个方法判断会比较准确:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
var o = {};
o.constructor === Object; // true

var o = new Object;
o.constructor === Object; // true

var a = [];
a.constructor === Array; // true

var a = new Array;
a.constructor === Array // true

var n = new Number(3);
n.constructor === Number; // true

toString

1
2
3
var a = [1,2,3]
Object.prototype.toString.call(obj) === '[Object Array]' // true
Object.prototype.toString.call(obj) === '[Object Object]' // false

这个方法调用会比较麻烦,所以推荐封装一个函数:
比如:

1
2
3
4
5
6
7
8
9
var isType = function(type) {
return function(obj) {
return Object.prototype.toString.call(obj) === '[object '+ type + ']';
}
}
var isArray = isType('Array')
var isObject = isType('Object')
isArray([]) // true
isObject([]) // false