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)
}