JavaScript:孔乙己的类型判断

这是我参与更文挑战的第24天,活动详情查看: 更文挑战

什么是孔乙己?

最经典的孔乙己当然是出自鲁迅先生的小说《孔乙己》了,而最令人记忆犹新的片段大概就是孔乙己抓着小孩子考校他们“回”字有几种写法的这一幕了。

今天,这篇文章也来还原下这一片段。

不过主题可不是“回”字的写法,而是JS中能做的类型判断有多少。

你可能会觉得这和“回”字的写法没啥区别,可你还没看完呢,先别妄下结论

基本类型与引用类型

常见的基本类型:Number,String,Boolean,Undefined,Null,Symbol;

引用类型:Object,Array,Function;

引用类型,我们通常会仅提及Object和Array, 类似Function等其他引用类型因为很少会做类型判断,所以多数时候也不会纳入函数中作为常用类型进行判断。

而今天,我们要做的就是,做个全盘的类型判断。

通常我们进行类型判断时,常用的就是typeof了,不过typeof并不完美;

typeof 1; // "number"
typeof {}; // "object"
typeof null; // "object"
typeof []; // "object"
复制代码

如上,在进行null,数组判断的时候,值都是'object',这显然不是 预期的效果。所以有了如下方法,进行判断;

利用Object的toString()方法以及call()方法来一招瞒天过海,移花接木,对任意类型调用toString()方法,继而得出一个结果[object TYPE]TYPE为被判断目标的真实类型。

// 可以检测的类型  注释内容是checkType中的结果。
var number = 1;	// [object Number]
var string = 'string';	// [object String]
var boolean = true; 	// [object Boolean]
var und = undefined;	// [object Undefined]
var nul = null;	// [object Null]
var obj = {a: 1};	// [object Object]
var array = [1,2,3];	// [object Array]
var date = new Date();	// [object Date]
var error = new Error();	// [object Error]
var reg = /a/g;	// [object RegExp]
var func = function a(){};	// [object Function]

function checkType(){
  Object.prototype.toString.call(arguments);	// [object Arguments]
     for(var i = 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) 	// [object Math]
Object.prototype.toString.call(JSON) 	// [object JSON]

// 实际用得到的写法: 不判断Math,JSON
var class2type = {};
"Boolean NUmber String Function Array Date RegExp Object Error Null Undefined".split(" ").map(function(item, index){
	class2type["[Object "+ item +"]"] = item.toLowerCase();
})

function type(obj){
  if(obj == null){
    return obj + "";
  }
    return typeof === 'object' || typeof obj === 'function' ?
    class2type[Object.prototype.toString.call(obj) || 'object' : typeof obj
}

复制代码

孔乙己的大学问

孔乙己的”回”字写法是有够死脑筋的,但是用对了地方,何尝不是一种钻研呢?

哈哈哈,希望能用得上吧。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享