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

时间:2021-05-25

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非常适合用来判断表单域的值是否为有效值。

声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

相关文章