有三种方式,分别为 typeof、instanceof 和Object.prototype.toString.call()
一、typeof
使用方法 :(typeof + 值 ) --返回一个字符串
// 基本数据类型
typeof 'banana' // 'string'
typeof true // 'boolean'
typeof 123 // 'number'
typeof Symbol() // 'symbol'
typeof null // 'object' 无法判定是否为 null
typeof undefined // 'undefined'
// 引用数据类型
typeof {} // 'object'
typeof [] // 'object'
typeof (() => {}) // 'function'
typeof方法判断数据类型不够精准
二、instanceof
使用方法:(值) instanceof (数据类型)–返回一个布尔值
[] instanceof Array // true
({}) instanceof Object // true
(()=>{}) instanceof Function // true
instanceof也是有缺陷的
let arr = []
let obj = {}
arr instanceof Array// true
arr instanceof Object// true
obj instanceof Object// true
obj instanceof Array// false
因为Object 构造函数在 arr 的原型链上 arr也判断为对象
三、Object.prototype.toString()
Object.prototype.toString.call({}) // '[object Object]'
Object.prototype.toString.call([]) // '[object Array]'
Object.prototype.toString.call(() => {}) // '[object Function]'
Object.prototype.toString.call('banana') // '[object String]'
Object.prototype.toString.call(123) // '[object Number]'
Object.prototype.toString.call(true) // '[object Boolean]'
Object.prototype.toString.call(Symbol()) // '[object Symbol]'
Object.prototype.toString.call(null) // '[object Null]'
Object.prototype.toString.call(undefined) // '[object Undefined]'
Object.prototype.toString.call(newDate()) // '[object Date]'
Object.prototype.toString.call(Math) // '[object Math]'
Object.prototype.toString.call(newSet()) // '[object Set]'
Object.prototype.toString.call(newWeakSet()) // '[object WeakSet]'
Object.prototype.toString.call(newMap()) // '[object Map]'
Object.prototype.toString.call(newWeakMap()) // '[object WeakMap]'
使用的时候封装一下
// $1表示括号里面的小正则 1表示匹配到的第一个
var type = function(data) {
var toString = Object.prototype.toString;
var dataType = toString
.call(data)
.replace(/\[object\s(.+)\]/, "$1")
.toLowerCase()
return dataType
};