这里检测对象类型不是指typeof
操作符返回的六种对象类型(string, number, boolean, object, function, undefined),而是指要区分出具体的引用类型(Object
, Array
, Date
, RegExp
, Function
)以及null
。测试结果具体见下表
测试对象 | 返回结果 |
---|---|
undefined | undefined |
null | null |
true | boolean |
1 | number |
“” | string |
{} | object |
[] | array |
new Date() | date |
/.css$/ | regexp |
function () {} | function |
window | global |
JS更多对象类型参见Standard built-in objects
检测对象是否是数组
工作中经常有需求检测一个对象是否是数组,常用方法有两种:
Array.isArray()
- 语法
Array.isArray(obj) |
- 举例:
Array.isArray([]); // true |
instanceof操作符
- 语法
obj instanceof Array; |
- 举例
[] instanceof Array; // true |
使用instanceof注意事项
如果变量是String
, Number
或者Boolean
类型,使用instanceof
操作符始终返回false
,见下代码:
var a = ''; |
这涉及基本包装类型的知识点,这里不做展开,可参考《JavaScript高级程序设计(第3版)》对基本包装类型的解释以及《The Principles of Object-Oriented JavaScript》对Primitive wrapper Types的解释。
检测对象类型通用方法
如果要判断某个对象是否是某种具体引用类型,使用instanceof
操作符就可以解决。但如果是想知道一个对象的具体类型(具体哪种基本类型、引用类型),使用instanceof
就不合理了,总不能一个个去试。
并且,instanceof
对于基本数据类型无能为力。
使用Object.prototype.toString.call(obj)
使用Object.prototype.toString.call(obj)
可以判断某个对象的具体类型。
- 语法
Object.prototype.toString.call(obj) |
该方法返回字符串,其中包含对象类型,格式如下”[object type]”,其中type为对象具体类型
- 举例
Object.prototype.toString.call([]); // "[object Array]" |
封装
使用Object.prototype.toString.call(obj)
可以检测对象的具体类型,但性能损耗,如果要频繁使用,可以对该方法封装后使用:
// 封装检测对象类型方法 |
// 测试 |