欢迎来到福编程网,本站提供各种互联网专业知识!

YUI 读码日记之 YAHOO.lang.is*

发布时间:2008-03-22 作者: 来源:转载
在YUI框架的%BULID%/yahoo/yahoo.js中,包含了一系列的变量类型检测方法,它们被分装成YAHOO.lang.is*。其中,这些函数的大部分封装都是typeof操作符的封装,我个人比较敢兴趣的事isArray与isValue的两个函数。
YAHOO.lang=YAHOO.lang||{
isArray:function(o){
if(o){
varl=YAHOO.lang;
//如果该对象有length这个属性,同时支持splice方法,
//那么就认为它为数组。
returnl.isNumber(o.length)&&l.isFunction(o.splice);
}
returnfalse;
},

isBoolean:function(o){
returntypeofo==='boolean';
},

isFunction:function(o){
returntypeofo==='function';
},

isNull:function(o){
returno===null;
},

isNumber:function(o){
returntypeofo==='number'&&isFinite(o);
},

isObject:function(o){
return(o&&(typeofo==='object'||
YAHOO.lang.isFunction(o)))||false;
},

isString:function(o){
returntypeofo==='string';
},

isUndefined:function(o){
returntypeofo==='undefined';
},

//...

isValue:function(o){
//Infinityfails
//return(o||o===false||o===0||o==='');
varl=YAHOO.lang;
return(l.isObject(o)||l.isString(o)||
l.isNumber(o)||l.isBoolean(o));
}
};……复制粘贴分割线……

据悉,在YUI2.2.0版本以前,YAHOO.lang.isArray是这样写的。

isArray:function(obj){
//safari有bug,只好处理字符串
if(obj&&obj.constructor&&
obj.constructor.toString().indexOf('Array')>-1){
returntrue;
}else{
returnYAHOO.lang.isObject(obj)&&obj.constructor==Array;
}
},而这样的判断数组类型是有缺陷的,比如下面的代码

functionmyArray(){
this.name='name';
}
varo2=newmyArray();
alert(YAHOO.util.isArray(o2));//弹出true
//因为obj.constructor.toString()中包含myArray字样,所以返回true

functionObj(){
this.name='name';
}
varo=newObj();
o.constructor=Array;
alert(YAHOO.util.isArray(o));//弹出true
//因为在JavaScript里,constructor也是属性
//可以动态指定,所以返回true因此,在YUI的后续版本,YAHOO.lang.isArray被修改成了目前的这个样子

isArray:function(o){
if(o){
varl=YAHOO.lang;
//如果该对象有length这个属性,同时支持splice方法,
//那么就认为它为数组。
returnl.isNumber(o.length)&&l.isFunction(o.splice);
}
returnfalse;
},新的实现用了另外的思路:如果该对象有length这个属性,同时支持splice方法,那么就认为它为数组。当然,它依然有漏洞,我们仍然可以创建一个对象,使其拥有length属性和splice方法。但我觉得现在的实现更为合理,因为一来可能性不大,二来避免了诡异的浏览器的BUG。

再看YUI2.3.0后引入的YAHOO.lang.isValue,其实就是判断参数是否是一个有意义的值,只要参数不是null/undefined/NaN,那么都返回true。(注意这和一般的判断真假的不同就是,0/false/''(空字符串)这些都算是有效的值),所以YAHOO.lang.isValue非常适合用来判断表单域的值是否为有效值。

相关推荐