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 相关文章推荐
JS 时间显示效果代码
Aug 23 Javascript
javascript hasFocus使用实例
Jun 29 Javascript
javascript自动改变文字大小和颜色的效果的小例子
Aug 02 Javascript
jQuery中bind与live的用法及区别小结
Jan 27 Javascript
推荐4个原生javascript常用的函数
Jan 12 Javascript
JavaScript搜索字符串并将搜索结果返回到字符串的方法
Apr 06 Javascript
javascript数组去重方法汇总
Apr 23 Javascript
每个程序员都需要学习 JavaScript 的7个理由小结
Sep 03 Javascript
javascript图片预览和上传(兼容IE)
Mar 15 Javascript
JavaScript运动框架 多物体任意值运动(三)
May 17 Javascript
BootStrap导航栏问题记录
Jul 31 Javascript
详解前端路由实现与react-router使用姿势
Aug 07 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 echo, print, print_r, sprintf, var_dump, var_expor的使用区别
2013/06/20 PHP
setAttribute 与 class冲突解决
2008/02/17 Javascript
javascript 框架小结 个人工作经验
2009/06/13 Javascript
js输入框邮箱自动提示功能代码实现
2013/12/10 Javascript
详解JavaScript中循环控制语句的用法
2015/06/03 Javascript
JS 实现倒计时数字时钟效果【附实例代码】
2016/03/30 Javascript
KnockoutJS 3.X API 第四章之表单textInput、hasFocus、checked绑定
2016/10/11 Javascript
原生js实现验证码功能
2017/03/16 Javascript
在HTML文档中嵌入JavaScript的四种方法
2018/05/07 Javascript
vue插件开发之使用pdf.js实现手机端在线预览pdf文档的方法
2018/07/12 Javascript
JS实现将二维数组转为json格式字符串操作示例
2018/07/12 Javascript
详解vuex中action何时完成以及如何正确调用dispatch的思考
2019/01/21 Javascript
vue elementUI table表格数据 滚动懒加载的实现方法
2019/04/04 Javascript
怎样使你的 JavaScript 代码简单易读(推荐)
2019/04/16 Javascript
详解如何写出一个利于扩展的vue路由配置
2019/05/16 Javascript
茶余饭后聊聊Vue3.0响应式数据那些事儿
2019/10/30 Javascript
bootstrap-paginator服务器端分页使用方法详解
2020/02/13 Javascript
Vuex中的Mutations的具体使用方法
2020/06/01 Javascript
Element Carousel 走马灯的具体实现
2020/07/26 Javascript
[04:45]上海特级锦标赛主赛事第三日TOP10
2016/03/05 DOTA
python创建一个最简单http webserver服务器的方法
2015/05/08 Python
Django 前后台的数据传递的方法
2017/08/08 Python
tensorflow 输出权重到csv或txt的实例
2018/06/14 Python
python实现贪吃蛇小游戏
2020/03/21 Python
Python实现定制自动化业务流量报表周报功能【XlsxWriter模块】
2019/03/11 Python
python使用opencv实现马赛克效果示例
2019/09/28 Python
python 多线程共享全局变量的优劣
2020/09/24 Python
python学习之使用Matplotlib画实时的动态折线图的示例代码
2021/02/25 Python
J2EE系统只能是基于web
2015/09/08 面试题
大二学生学习个人自我评价
2014/01/19 职场文书
教堂婚礼主持词
2014/03/14 职场文书
2014年人力资源工作总结
2014/11/19 职场文书
护士实习自荐信
2015/03/06 职场文书
企业财务管理制度范本
2015/08/04 职场文书
Eclipse+Java+Swing+Mysql实现电影购票系统(详细代码)
2022/01/18 Java/Android
Python 统计序列中元素的出现频度
2022/04/26 Python