Zepto中如何实现"变量"的类型判断
程序员文章站
2022-05-03 18:05:06
...
首先,必须了解js一些基础问题
null == undefined; //这个的执行结果是true
null === undefined; //执行结果为false
//这个的判断标准小技巧: == 判断值是否相等。=== 判断值和类型都是否相等
类型判断的思路来源
//思路的来源是Object的toString()方法。
console.log({}.toString());//[object Object]
而类似的,对字符串使用这个方法得到的结果就是:[object String].
对数字使用这个方法的结果就是:[object Number].
通过这个Object的toString()方法我们就能够得到一个这样的来源。
实现方式
var obj = {};
var toString = obj.toString;//得到对象的toString方法
//申明一个映射表。
var myTable = {
"[object Object]":'object',
"[object Array]":'array',
"[object String]":'string',
"[object Boolean]":'boolean'
}
//判断类型的函数
function type(value){
return value == null? String(value):myTable[toString.call(value)] || 'object';
}
console.log(type('abc'));//string
console.log(type({}));//object
上面的type函数看起来很懵?来解析一下:
作用:当值是undefined和null时,直接返回类型结果:undefined和null。其它的时候,会执行方法toString,这个toString方法是通过继承的方式来执行的。(为什么要用继承的方式?因为除Object之外,其它类型的toString方法已经进行过改造了,例如:)
console.log('abc'.toString());//abc
console.log(toString.call('abc'));//[object String]
最后利用myTable映射表实现转换。
zepto源码中的实现是怎么样的?
var $ = {};
class2type = {},
toString = class2type.toString;
//定义一个函数,名字是$.each;
$.each = function (elements, callback) {
for(key in elements) if(callback.call(elements[key],key,elements[key]) === false) return elements
}
//调用一个函数,形成映射表 $.each(["Boolean",'Number','String','Function','Array','Date','RegExp','Object','Error'],function (i,name) {
class2type['[object '+ name + ']'] = name.toLowerCase();
});
//判断类型函数。
function type(obj) {
return obj == null ? String(obj) : class2type[toString.call(obj)] || "object";
}