js判断数据类型

javascript有五种简单(基本)数据类型undefined、null、boolean、number和string,还有一种复杂(引用)数据类型,object。一般判断数据类型有以下几种方法:

typeof操作符

typeof true  // "boolean"
typeof 1  // "number"
typeof ""  // ''string"
typeof undefined  // "undefined"
typeof (function(){})  // "function"
typeof {}  // "object"
typeof []  // "object"
typeof null  // "object"
// es6
typeof new Set()  // "object"
typeof new Map()  // "object"
typeof Symbol(1)  // "symbol"

可以看出typeof无法区分某些数据类型

instanceof操作符

instanceof运算符用于测试构造函数的prototype属性是否出现在对象的原型链中的任何位置。

object instanceof constructor

null和undefined没有构造函数,所以不能用instanceof判断。字面量定义的number,boolean和string也不能用instanceof判断。

true instanceof Boolean  // false
1 instanceof Number  // false
"" instanceof String  // false
new Boolean(true) instanceof Boolean  // true
new Number(1) instanceof Number  // true
new String("") instanceof String  // true
[] instanceof Array  // true
({}) instanceof Object  // true
(function(){}) instanceof Function  // true
new Set() instanceof Set  // true
new Map() instanceof Map  // true
Symbol(1) instanceof Symbol  // false

从instanceof的定义其实可以看出它的主要功能是判断第二个参数(构造函数)是否在对象(实例)的原型链上,对于没有构造函数,或者直接用字面量定义的数据,instanceof不起作用。boolean,number和string类型可能用构造函数定义或者包装类型将其转化为对象。
另外,字面量定义的对象需要用括号包起来才能使用instanceof运算符,因为在js中{}也是代码块的意思。

{} instanceof Object  // Uncaught SyntaxError: Unexpected token instanceof

constructor

直接通过构造函数判断,与instanceof相似,只能用来判断引用类型。

[].constructor === Array  // true
({}).constructor === Object  // true
(function(){}).constructor === Function  // true

Object.prototype.toString

麻烦又通用的方法。

Object.prototype.toString.call(true)  // "[object Boolean]"
Object.prototype.toString.call(1)  // "[object Number]"
Object.prototype.toString.call("")  // "[object String]"
Object.prototype.toString.call({})  // "[object Object]"
Object.prototype.toString.call([])  // "[object Array]"
Object.prototype.toString.call(function(){})  // "[object Function]"
Object.prototype.toString.call(null)  // "[object Null]"
Object.prototype.toString.call(undefined)  // "[object Undefined]"
Object.prototype.toString.call(new Set())  // "[object Set]"
Object.prototype.toString.call(new Map())  // "[object Map]"
Object.prototype.toString.call(Symbol(1))  // "[object Symbol]"

这个方法还可以判断js中一些内置的对象,或者DOM

Object.prototype.toString.call(new Date())  // "[object Date]"
Object.prototype.toString.call(/s/)  // "[object RegExp]"
Object.prototype.toString.call(document)  // "[object HTMLDocument]"
Object.prototype.toString.call(document.getElementsByTagName('body'))  // "[object HTMLCollection]"

可以封装成getType方法

function getType(data){
  var str = Object.prototype.toString.call(data)
  return str.substring(8, str.length - 1)
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容