1 typeof
可以确定值的原始类型
1.2 使用
typeof value
1.2 返回值
boolean:布尔值
function:函数
number:数值
object:对象或null
string:字符串
symbol:符号
undefined:未定义
1.3 缺点
不能具体细分对象
console.log(typeof null) // object
console.log(typeof []) // object
console.log(typeof undefined) // undefined
console.log(typeof 123) // number
console.log(typeof function() {}) // function
2 instanceof
用于确保值的引用类型,当前实例是否属于某个类
2.1 使用:
value instanceof type
2.2 返回值:
属于返回true,不属于返回false
2.3 缺点:
2.3.1 只要是这个实例原型链上的类,用instanceof检测都是true
2.3.2 无法检测null和undefined,会报错
2.3.3 无法检测直接赋值的基本数据类型,通过new 关键字创建的基本数据类型才能检测
console.log([] instanceof Array) // true
console.log({} instanceof Array) // false
console.log(function(){} instanceof Function) // true
function Fn() {}
Fn.prototype = [];
console.log(Fn instanceof Function) // true
console.log(new Fn() instanceof Array) // true
console.log(new Fn() instanceof Fn) // true
console.log(123 instanceof Number) // false
console.log(new Number(123) instanceof Number) // true
3 constructor
3.1 使用
value.constructor === type
3.2 返回值
数据类型
3.2 缺点
原型可以被改变。声明一个构造函数,将其原型指向其他类型。constructor无法检测原来的类型。
console.log([].constructor === Array) // true
console.log({}.constructor === Array) // false
console.log((function(){}).constructor === Function) // true
function Fn() {}
console.log(Fn.constructor == Function) // true
console.log((new Fn()).constructor === Fn) // true
Fn.prototype = [];
console.log(Fn.constructor == Function) // true
console.log((new Fn()).constructor === Fn) // false
console.log((new Fn()).constructor == Array) // true
console.log((123).constructor === Number) // true
console.log((new Number(123).constructor === Number)) // true
4 Object.prototype.toString.call()
最优解
4.1 使用
在object.prototype上有一个toString方法,这个方法执行时会返回方法中this关键字对应数据值的数据类型
通过call/apply改变里面的this关键词,检测指定数据的类型
4.2 返回值
[object 数据类型] 固定格式的字符串
let a = Object.prototype.toString
console.log(a.call([]),typeof (a.call([]))) // [object Array] string
console.log(a.call({})) // [object Object]
console.log((a.call(function(){}))) // [object Function]
function Fn() {}
console.log(a.apply(Fn)) // [object Function]
console.log(a.apply(new Fn())) // [object Object]
Fn.prototype = [];
console.log(a.apply(Fn)) // [object Function]
console.log(a.apply(new Fn())) // [object Object]
console.log(a.call(123)) // [object Number]
console.log(a.call(new Number(123))) // [object Number]
参考:https://www.cnblogs.com/zt123123/p/7623409.html