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