这篇文章主要是我学习的笔记,希望能给你带来启发:
typeofinstanceofconstructorObject.prototype.toString.call
一、数据类型检测一:typeof
- 返回的结果都是字符串
- 字符串包含了对应的数据类型
"number"/"string"/"boolean"/"undefined"/"object"/"function" - 局限性:
- 1、
typeof null=>"object"null不是对象,它是空对象指针 - 2、 检测数据或者正则等特殊对象,返回结果都是
"object",所以无法基于typeof判断是数据还是正则
- 1、
console.log(typeof 12); //"number"
console.log(typeof []); //"object"
console.log(typeof typeof []); //"string"
二、数据类型检测二:instanceof
- 检测某个实列是否属于这个类
- 检测的底层机制:所有出现在其原型链上的类,检测结果都是
ture
console.log(12 instanceof Number); //=>false
console.log(new Number(12)instanceof Number);//=>ture
console.log([] instanceof Array); //=>ture
console.log([] instanceof Object); //=>ture
- 局限性
- 由于可以基于
__proto__或者prototype改动原型链的动向,所有基于instanceof检测出来的结果并不一定是准确的 - 基本数据类型的值,连对象都不是,更没有
__proto__,虽说也是所属类的实列,在js中也可以调取所属类原型上的方法,但是instanceof是不认的
function Fn(){ Fn.prototype.__proto__=Array.prototype; let f=new Fn(); //原型链:f ->Fn.prototype ->Array.prototype -> Object.prototype }三、数据类型检测三:constructor
constructor和instanceof检测数据的方法是类似的就不再赘述了,直接参考上例即可。四、数据类型检测四:Object.prototype.toString.call(value)
语法:({}).toString.call([value]) - 由于可以基于
- 不是用来转换为 字符串的,而是返回当前实列所属类的信息
- 格式:"[
object所属类信息]" - "
[object Object/Array/String/Null/undefined/Number/Symbol/functin...]" - 这种方式基本上没有什么局限性,是检测数据类型最准确的方式
如图所示:

- "
[object object/Array]" - Number/String/Boolean/Symbol他们的原型上都有:
- 1、
toString:转化成为字符串 - 2、
valueof:返回原始值
- 1、
Array/RegExp/Function等内置的原型上都有 :- 1、
toString:转化成为字符串 - 2、
valueof:返回原始值
- 1、
object的原型上有:- 1、
toString:返回当前实列所属类的信息 - 2、
valueof:返回原始值
- 1、