什么是孔乙己?
最经典的孔乙己当然是出自鲁迅先生的小说《孔乙己》了,而最令人记忆犹新的片段大概就是孔乙己抓着小孩子考校他们“回”字有几种写法的这一幕了。
今天,这篇文章也来还原下这一片段。
不过主题可不是“回”字的写法,而是JS中能做的类型判断有多少。
你可能会觉得这和“回”字的写法没啥区别,可你还没看完呢,先别妄下结论。
基本类型与引用类型
常见的基本类型:Number,String,Boolean,Undefined,Null,Symbol;
引用类型:Object,Array,Function;
引用类型,我们通常会仅提及Object和Array, 类似Function等其他引用类型因为很少会做类型判断,所以多数时候也不会纳入函数中作为常用类型进行判断。
而今天,我们要做的就是,做个全盘的类型判断。
通常我们进行类型判断时,常用的就是typeof
了,不过typeof
并不完美;
typeof1;//"number"typeof{};//"object"typeofnull;//"object"typeof[];//"object"
如上,在进行null
,数组判断的时候,值都是'object'
,这显然不是 预期的效果。所以有了如下方法,进行判断;
利用Object的toString()
方法以及call()
方法来一招瞒天过海,移花接木,对任意类型调用toString()
方法,继而得出一个结果[object TYPE]
。 TYPE
为被判断目标的真实类型。
//可以检测的类型注释内容是checkType中的结果。varnumber=1;//[objectNumber]varstring='string';//[objectString]varboolean=true;//[objectBoolean]varund=undefined;//[objectUndefined]varnul=null;//[objectNull]varobj={a:1};//[objectObject]vararray=[1,2,3];//[objectArray]vardate=newDate();//[objectDate]varerror=newError();//[objectError]varreg=/a/g;//[objectRegExp]varfunc=functiona(){};//[objectFunction]functioncheckType(){Object.prototype.toString.call(arguments);//[objectArguments]for(vari=0;i<arguments.length;i++){console.log(Object.prototype.toString.call(arguments);}}checkType(number,string,boolean,und,nul,obj,array,date,error,reg,func)Object.prototype.toString.call(Math)//[objectMath]Object.prototype.toString.call(JSON)//[objectJSON]//实际用得到的写法:不判断Math,JSONvarclass2type={};"BooleanNUmberStringFunctionArrayDateRegExpObjectErrorNullUndefined".split("").map(function(item,index){class2type["[Object"+item+"]"]=item.toLowerCase();})functiontype(obj){if(obj==null){returnobj+"";}returntypeof==='object'||typeofobj==='function'?class2type[Object.prototype.toString.call(obj)||'object':typeofobj}
孔乙己的大学问
孔乙己的"回"字写法是有够死脑筋的,但是用对了地方,何尝不是一种钻研呢?
哈哈哈,希望能用得上吧!
作者:林深鹿