You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
jQuery.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(i,name){class2type["[object "+name+"]"]=name.toLowerCase();});
Activity
CodeRookie262 commentedon Feb 1, 2021
常用判断类型的方法主要有
typeof,instanceof,constructor以及Object.prototype.toString等等。typeof
typeof的检测机制是根据底层的二进制数据进行判断的,可以检测出的类型分别由number,boolean,string,undefined,function,object,symbol和bigint。关于
typeof的检测有一个历史遗留的bug,那就是检测null的结果和检测对象的结果都是object,这个是因为typeof将二进制中前三位如果为 0 的判断为object类型,而null是空指针,都是 0,所以被检测为object。typeof null 透析instanceof
检测某个实例是否隶属于该类,使用方法 ++
实例 instanceof 类++。先说说它的不足点,其实它并不能准确的用来检测类型,只不过可以用来弥补
typeof的一些不足点。不足点:
2333,"CodeRookie262",true,Symbol()以及122n这些基础类型)[Symbol.hasInstance](instance)进行判断,这个方法可以随意更改,可能会导致结果不准确;Object;底层原理:
优先查找类原型上是否存在
[Symbol.hasInstance]方法,有的话则直接返回函数调用的结果,如果不存在此方法则从__proto__原型链上开始查找,直到找到类的原型constructor.prototype。constructor
constructor和instanceof差不多,不过它可以检测基础类型,例如(1).constructor === Number,同时他只能检测它的直属类进行判断,不会和instanceof对原型链进行遍历向上查找原型。Object.prototype.toString
Object.prototype.toString可以说是最接近完美的方案了,可以检测很多类型,包括内置类(Number,String,Date,RegExp...);其中一些类自身的都具有
toString方法,不过它们的这个方法并不能用来检测类型,而是将数据转换为字符串,例如Array.prototype.toString,只有Object.prototype.toString可以用来检测数据的类型,使用它的时候必须借用上下文重定向(说人话就是需要改变 this),利用鸭子模型进行调用从而得到对应的数据类型;可以看看著名的 JQuery 的源码中有一个数据类型检测就是借用它来封装的。
填充 class2type 表
添加数据类型检测拓展方法
判断是否是类数组