比typeof运算符更准确的类型判断
不同数据类型的Object.prototype.toString
方法返回值如下。
- 数值:返回
[object Number]
。
- 字符串:返回
[object String]
。
- 布尔值:返回
[object Boolean]
。
- undefined:返回
[object Undefined]
。
- null:返回
[object Null]
。
- 数组:返回
[object Array]
。
- arguments 对象:返回
[object Arguments]
。
- 函数:返回
[object Function]
。
- Error 对象:返回
[object Error]
。
- Date 对象:返回
[object Date]
。
- RegExp 对象:返回
[object RegExp]
。
- 其他对象:返回
[object Object]
。
这就是说,Object.prototype.toString
可以看出一个值到底是什么类型。
1 2 3 4 5 6 7 8
| Object.prototype.toString.call(2) Object.prototype.toString.call('') Object.prototype.toString.call(true) Object.prototype.toString.call(undefined) Object.prototype.toString.call(null) Object.prototype.toString.call(Math) Object.prototype.toString.call({}) Object.prototype.toString.call([])
|
利用这个特性,可以写出一个比typeof
运算符更准确的类型判断函数。
1 2 3 4 5 6 7 8 9 10 11
| var type = function (o){ var s = Object.prototype.toString.call(o) return s.match(/\[object (.*?)\]/)[1].toLowerCase() } type({}); type([]); type(5); type(null); type(); type(/abcd/); type(new Date());
|
在上面这个type
函数的基础上,还可以加上专门判断某种类型数据的方法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| var type = function (o){ var s = Object.prototype.toString.call(o); return s.match(/\[object (.*?)\]/)[1].toLowerCase(); };
['Null', 'Undefined', 'Object', 'Array', 'String', 'Number', 'Boolean', 'Function', 'RegExp' ].forEach(function (t) { type['is' + t] = function (o) { return type(o) === t.toLowerCase(); }; });
type.isObject({}) type.isNumber(NaN) type.isRegExp(/abc/)
|