|
isArray: function(o) {
if (o) {
var l = YAHOO.lang;
// 如果該對象有 length 這個屬性,同時支持 splice 方法,
// 那么就認(rèn)為它為數(shù)組。
return l.isNumber(o.length) && l.isFunction(o.splice);
}
return false;
},
isBoolean: function(o) {
return typeof o === 'boolean';
},
isFunction: function(o) {
return typeof o === 'function';
},
isNull: function(o) {
return o === null;
},
isNumber: function(o) {
return typeof o === 'number' && isFinite(o);
},
isObject: function(o) {
return (o && (typeof o === 'object' ||
YAHOO.lang.isFunction(o))) || false;
},
isString: function(o) {
return typeof o === 'string';
},
isUndefined: function(o) {
return typeof o === 'undefined';
},
//...
isValue: function(o) {
// Infinity fails
// return (o || o === false || o === 0 || o === '');
var l = YAHOO.lang;
return (l.isObject(o) || l.isString(o) ||
l.isNumber(o) || l.isBoolean(o));
}
};…… 復(fù)制粘貼分割線 ……
據(jù)悉,在 YUI 2.2.0 版本以前,YAHOO.lang.isArray 是這樣寫的。
isArray: function(obj) {
// safari 有 bug,只好處理字符串
if (obj && obj.constructor &&
obj.constructor.toString().indexOf('Array') > -1) {
return true;
} else {
return YAHOO.lang.isObject(obj) && obj.constructor == Array;
}
},而這樣的判斷數(shù)組類型是有缺陷的,比如下面的代碼
function myArray() {
this.name = 'name';
}
var o2 = new myArray();
alert(YAHOO.util.isArray(o2)); // 彈出true
// 因為 obj.constructor.toString() 中包含 myArray 字樣,所以返回true
function Obj() {
this.name = 'name';
}
var o = new Obj();
o.constructor = Array;
alert(YAHOO.util.isArray(o)); // 彈出 true
// 因為在 JavaScript 里,constructor 也是屬性
// 可以動態(tài)指定,所以返回 true因此,在 YUI 的后續(xù)版本,YAHOO.lang.isArray 被修改成了目前的這個樣子
isArray: function(o) {
if (o) {
var l = YAHOO.lang;
// 如果該對象有 length 這個屬性,同時支持 splice 方法,
// 那么就認(rèn)為它為數(shù)組。
return l.isNumber(o.length) && l.isFunction(o.splice);
}
return false;
},新的實現(xiàn)用了另外的思路:如果該對象有 length 這個屬性,同時支持 splice 方法,那么就認(rèn)為它為數(shù)組。當(dāng)然,它依然有漏洞,我們?nèi)匀豢梢詣?chuàng)建一個對象,使其擁有 length 屬性和 splice 方法。但我覺得現(xiàn)在的實現(xiàn)更為合理,因為一來可能性不大,二來避免了詭異的瀏覽器的 BUG 。
再看 YUI 2.3.0 后引入的 YAHOO.lang.isValue,其實就是判斷參數(shù)是否是一個有意義的值,只要參數(shù)不是 null/undefined/NaN,那么都返回 true。(注意這和一般的判斷真假的不同就是, 0/false/''(空字符串) 這些都算是有效的值),所以 YAHOO.lang.isValue 非常適合用來判斷表單域的值是否為有效值。
JavaScript技術(shù):YUI 讀碼日記之 YAHOO.lang.is*,轉(zhuǎn)載需保留來源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。