当前位置: 首页 > 图文教程 > 网络编程 > Javascript > YUI 读码日记之 YAHOO.lang.is*

Javascript
Javascript的匿名函数小结
js跟随滚动条滚动浮动代码
js监听表单value的修改同步问题,跨浏览器支持
JavaScript 模拟用户单击事件
javascript 获取表单file全路径
让IE8支持DOM 2(不用框架!)
javascript控制frame,iframe的src属性代码
JavaScript 井字棋人工智能实现代码
javascript showModalDialog模态对话框使用说明
JavaScript 学习笔记(四)
JavaScript 学习笔记(五)
JavaScript 学习笔记(六)
JavaScript 学习笔记(七)字符串的连接
js下用gb2312编码解码实现方法
javascript 面向对象技术基础教程
javascript eval和JSON之间的联系
JavaScript 数组循环引起的思考
url 特殊字符 传递参数解决方法
jQuery animate(滑块滑动效果代码)
用javascript做一个小游戏平台 (二) 游戏选择器

Javascript 中的 YUI 读码日记之 YAHOO.lang.is*


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-12   浏览: 218 ::
收藏到网摘: n/a

在 YUI 框架的 %BULID%/yahoo/yahoo.js 中,包含了一系列的变量类型检测方法,它们被分装成 YAHOO.lang.is* 。其中,这些函数的大部分封装都是 typeof 操作符的封装,我个人比较敢兴趣的事 isArray 与 isValue 的两个函数。 YAHOO.lang = YAHOO.lang || {
isArray: function(o) {
if (o) {
var l = YAHOO.lang;
// 如果该对象有 length 这个属性,同时支持 splice 方法,
// 那么就认为它为数组。
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));
}
};…… 复制粘贴分割线 ……
据悉,在 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;
}
},而这样的判断数组类型是有缺陷的,比如下面的代码
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 也是属性
// 可以动态指定,所以返回 true因此,在 YUI 的后续版本,YAHOO.lang.isArray 被修改成了目前的这个样子
isArray: function(o) {
if (o) {
var l = YAHOO.lang;
// 如果该对象有 length 这个属性,同时支持 splice 方法,
// 那么就认为它为数组。
return l.isNumber(o.length) && l.isFunction(o.splice);
}
return false;
},新的实现用了另外的思路:如果该对象有 length 这个属性,同时支持 splice 方法,那么就认为它为数组。当然,它依然有漏洞,我们仍然可以创建一个对象,使其拥有 length 属性和 splice 方法。但我觉得现在的实现更为合理,因为一来可能性不大,二来避免了诡异的浏览器的 BUG 。
再看 YUI 2.3.0 后引入的 YAHOO.lang.isValue,其实就是判断参数是否是一个有意义的值,只要参数不是 null/undefined/NaN,那么都返回 true。(注意这和一般的判断真假的不同就是, 0/false/''(空字符串) 这些都算是有效的值),所以 YAHOO.lang.isValue 非常适合用来判断表单域的值是否为有效值。