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 相关文章推荐
jQuery(1.3.2) 7行代码搞定跟随屏幕滚动的层
May 21 Javascript
javascript实现复制与粘贴操作实例
Oct 16 Javascript
javascript父子页面通讯实例详解
Jul 17 Javascript
JavaScript实现页面跳转的几种常用方式
Nov 28 Javascript
一些实用性较高的js方法
Apr 19 Javascript
js实现图片加载淡入淡出效果
Apr 07 Javascript
Angular中使用$watch监听object属性值的变化(详解)
Apr 24 Javascript
值得收藏的vuejs安装教程
Nov 21 Javascript
angular动态表单制作
Feb 23 Javascript
关于Angularjs中自定义指令一些有价值的细节和技巧小结
Apr 22 Javascript
微信小程序日历组件使用方法详解
Dec 29 Javascript
JS实现数组删除指定元素功能示例
Jun 05 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
一个数据采集类
2007/02/14 PHP
PHP批量生成静态HTML的简单原理和方法
2014/04/20 PHP
php使用CutyCapt实现网页截图保存的方法
2016/10/03 PHP
PHP 中魔术常量的实例详解
2017/10/26 PHP
php实现的三个常用加密解密功能函数示例
2017/11/06 PHP
基于mootools 1.3框架下的图片滑动效果代码
2011/04/22 Javascript
javascript教程:关于if简写语句优化的方法
2014/05/17 Javascript
JS完整获取IE浏览器信息包括类型、版本、语言等等
2014/05/22 Javascript
jQuery Ajax中的事件详细介绍
2015/04/16 Javascript
Javascript中indexOf()和lastIndexOf应用方法实例
2016/08/24 Javascript
AngularJS使用ng-inlude指令加载页面失败的原因与解决方法
2017/01/19 Javascript
js鼠标经过tab选项卡时实现切换延迟
2017/03/24 Javascript
微信小程序学习之数据处理详解
2017/07/05 Javascript
Vue中对比scoped css和css module的区别
2018/05/17 Javascript
vue+koa2实现session、token登陆状态验证的示例
2019/08/30 Javascript
解决vue admin element noCache设置无效的问题
2019/11/12 Javascript
在vue中使用eslint,配合vscode的操作
2020/11/09 Javascript
[49:35]2018DOTA2亚洲邀请赛3月30日 小组赛A组 KG VS TNC
2018/03/31 DOTA
[00:32]2018DOTA2亚洲邀请赛Liquid出场
2018/04/03 DOTA
python生成器generator用法实例分析
2015/06/04 Python
Python模块结构与布局操作方法实例分析
2017/07/24 Python
python切片及sys.argv[]用法详解
2018/05/25 Python
numpy使用fromstring创建矩阵的实例
2018/06/15 Python
Python面向对象之静态属性、类方法与静态方法分析
2018/08/24 Python
美国正宗奢华复古手袋、珠宝及配饰网站:What Goes Around Comes Around
2018/07/21 全球购物
泰国第一在线超市:Tops
2021/02/13 全球购物
法学院方阵解说词
2014/01/29 职场文书
读书活动总结
2014/04/28 职场文书
2014国庆黄金周超市促销活动方案
2014/09/21 职场文书
领导干部整治奢华浪费之风思想汇报
2014/10/07 职场文书
公司离职证明标准格式
2014/11/18 职场文书
暖春观后感
2015/06/08 职场文书
安全主题班会教案
2015/08/12 职场文书
团队拓展训练心得体会
2016/01/12 职场文书
MySQL命令无法输入中文问题的解决方式
2021/08/30 MySQL
python人工智能human learn绘图可创建机器学习模型
2021/11/23 Python