这是我参与更文挑战的第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