首先说一下js中的数据类型
基本数据类型:String、Number、Boolean、null、undefined、Symbol
引用数据类型:Object
1.typeof
const a1 = Symbol('a1')
console.log(typeof '11');//string
console.log(typeof 1);//number
console.log(typeof true);//boolean
console.log(typeof null);//object
console.log(typeof undefined);//undefined
console.log(typeof a1);//symbol
console.log(typeof [1,2,3]);//object
console.log(typeof {name:'11'}); //object
值得注意的是:null会被typeof检测为object
因为js数据类型在底层都是以二进制的形式表示的,二进制的前三位为0会被typeof判断为对象类型,而null的二进制位恰好都是0
2.instanceof
const a1 = Symbol('a1')
var f = function(params) {}
var str = new String('lrn')
console.log('11' instanceof String);//false 必须new后才为true
console.log(str instanceof String);//true
var num = new Number(1)
console.log(1 instanceof Number);//false
console.log(num instanceof Number);//true
var boo = new Boolean(true)
console.log(true instanceof Boolean);//false
console.log(boo instanceof Boolean);//true
console.log(a1 instanceof Symbol);//false(Symbol函数不能使用new命令)
console.log([1,2,3] instanceof Array);//true
console.log(f instanceof Function);//true
console.log(null instanceof Null)//Null is not defined
console.log(undefined instanceof Undefined);//Undefined is not defined
instanceof实现原理:遍历左边变量的原型链,直到找到右边变量的prototype
instanceof只可以判断通过构造函数创建的基本数据类型(不包括null、undefined、symbol)和引用数据类型
3.Object.prototype.toString.call(适用于所有类型)
const a1 = Symbol('a1')
var b = new Set()
var c = new Map()
console.log(Object.prototype.toString.call('1',1,false));//[object String]
console.log(Object.prototype.toString.call(1));//[object Number]
console.log(Object.prototype.toString.call(false));//[object Boolean]
console.log(Object.prototype.toString.call(null));//[object Null]
console.log(Object.prototype.toString.call(undefined));//[object Undefined]
console.log(Object.prototype.toString.call(a1));//[object Symbol]
console.log(Object.prototype.toString.call(b));//[object Set]
console.log(Object.prototype.toString.call(c));//[object Map]
4.constructor
var f = function(params) {}
const a1 = Symbol('a1')
console.log(f.constructor);//ƒ Function()
console.log([1,2,3].constructor);//ƒ Array()
console.log({'name':'李四'}.constructor);//ƒ Object()
console.log(true.constructor);//ƒ Boolean()
console.log('1'.constructor);//ƒ String()
console.log(123.constructor);//报错
var num = new Number(12)
console.log(num.constructor);//ƒ Number()
console.log(a1.constructor);//ƒ Symbol()
console.log(null.constructor);//Cannot read properties of null
console.log(undefined.constructor);//Cannot read properties of undefined
可见constructor无法判断null、undefined和直接赋值的数字
总结:
基本数据类型(除null)建议用typeof
引用数据类型用instanceof和constructor
Object.prototype.toString.call适用于一切类型
如有错误和建议,欢迎批评指正