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


Posted in Javascript onMarch 22, 2008

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

Javascript 相关文章推荐
关于div自适应高度/左右高度自适应一致的js代码
Mar 22 Javascript
JS实现OCX控件的事件响应示例
Sep 17 Javascript
JS输入用户名自动显示邮箱后缀列表的方法
Jan 27 Javascript
基于jQuery仿淘宝产品图片放大镜特效
Oct 19 Javascript
Bootstrap自动适应PC、平板、手机的Bootstrap栅格系统
May 27 Javascript
JS控制div跳转到指定的位置的几种解决方案总结
Nov 05 Javascript
详解jQuery停止动画——stop()方法的使用
Dec 14 Javascript
js笔试题-接收get请求参数
Jun 15 Javascript
如何使用50行javaScript代码实现简单版的call,apply,bind
Aug 14 Javascript
jQuery实现数字华容道小游戏(实例代码)
Jan 16 jQuery
vue和H5 draggable实现拖拽并替换效果
Jul 29 Javascript
在vue中实现清除echarts上次保留的数据(亲测有效)
Sep 09 Javascript
详解new function(){}和function(){}() 区别分析
Mar 22 #Javascript
Javascript的一种模块模式
Mar 22 #Javascript
javascript cookie解码函数(兼容ff)
Mar 17 #Javascript
简单的JS多重继承示例
Mar 13 #Javascript
JMenuTab简单使用说明
Mar 13 #Javascript
JObj预览一个JS的框架
Mar 13 #Javascript
DHTML Slide Show script图片轮换
Mar 03 #Javascript
You might like
php递归函数中使用return的注意事项
2014/01/17 PHP
Thinkphp中Create方法深入探究
2014/06/16 PHP
PHP开发框架kohana中处理ajax请求的例子
2014/07/14 PHP
深入讲解PHP Session及如何保持其不过期的方法
2015/08/18 PHP
PHP数据库连接mysql与mysqli对比分析
2016/01/04 PHP
提交表单后 PHP获取提交内容的实现方法
2016/05/25 PHP
php与c 实现按行读取文件实例代码
2017/01/03 PHP
基于jquery的15款幻灯片插件
2011/04/10 Javascript
Extjs gridpanel 出现横向滚动条问题的解决方法
2011/07/04 Javascript
jQuery实现列表自动循环滚动鼠标悬停时停止滚动
2013/09/06 Javascript
JavaScript字符串对象substr方法入门实例(用于截取字符串)
2014/10/16 Javascript
AngularJS中的模块详解
2015/01/29 Javascript
Markdown与Bootstrap相结合实现图片自适应属性
2016/05/04 Javascript
非常酷炫的Bootstrap图片轮播动画
2016/05/27 Javascript
JS在浏览器中解析Base64编码图像
2017/02/09 Javascript
vue-cli+webpack记事本项目创建
2017/04/01 Javascript
Vue 实现前进刷新后退不刷新的效果
2019/06/14 Javascript
JavaScript实现随机五位数验证码
2019/09/27 Javascript
nodejs使用socket5进行代理请求的实现
2020/02/21 NodeJs
python使用多进程的实例详解
2018/09/19 Python
Python Pandas实现数据分组求平均值并填充nan的示例
2019/07/04 Python
如何在Django项目中引入静态文件
2019/07/26 Python
Python利用PyExecJS库执行JS函数的案例分析
2019/12/18 Python
Python实现PS滤镜中的USM锐化效果
2020/12/04 Python
Cole Haan官方网站:美国时尚潮流品牌
2017/12/06 全球购物
New Balance加拿大官方网站:运动鞋和健身服装
2018/11/19 全球购物
C#如何调用Word并打开一个Word文档
2013/05/08 面试题
行政管理人员精品工作推荐信
2013/11/04 职场文书
体育专业自荐书
2014/05/29 职场文书
政工例会汇报材料
2014/08/26 职场文书
个人四风问题对照检查材料
2014/10/01 职场文书
开学典礼观后感
2015/06/15 职场文书
2015年防灾减灾工作总结
2015/07/24 职场文书
2016年优秀少先队员事迹材料
2016/02/26 职场文书
js实现自动锁屏功能
2021/06/02 Javascript
python not运算符的实例用法
2021/06/30 Python