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 相关文章推荐
javascript 函数速查表
Feb 07 Javascript
juqery 学习之三 选择器 可见性 元素属性
Nov 25 Javascript
Javascript单元测试框架QUnitjs详细介绍
May 08 Javascript
JavaScript strike方法入门实例(给字符串加上删除线)
Oct 17 Javascript
详解Angualr 组件间通信
Jan 21 Javascript
AngularJS+Bootstrap3多级导航菜单的实现代码
Aug 16 Javascript
vue router仿天猫底部导航栏功能
Oct 18 Javascript
vue-scroller记录滚动位置的示例代码
Jan 17 Javascript
JavaScrip数组去重操作实例小结
Jun 20 Javascript
js 对象使用的小技巧实例分析
Nov 08 Javascript
webpack常用构建优化策略小结
Nov 21 Javascript
JavaScript将数组转换为链表的方法
Feb 16 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 IN_ARRAY 函数使用注意事项
2010/07/24 PHP
开启PHP Static 关键字之旅模式
2015/11/13 PHP
Vagrant(WSL)+PHPStorm+Xdebu 断点调试环境搭建
2019/12/13 PHP
javascript 面向对象的JavaScript类
2010/05/04 Javascript
使用jQuery清空file文件域的解决方案
2013/04/12 Javascript
JS小功能(onmouseover实现选择月份)实例代码
2013/11/28 Javascript
jQuery标签编辑插件Tagit使用指南
2015/04/21 Javascript
超漂亮的jQuery图片轮播特效
2015/11/24 Javascript
js中flexible.js实现淘宝弹性布局方案
2020/06/23 Javascript
JS实现屏蔽网页右键复制及ctrl+c复制的方法【2种方法】
2016/09/04 Javascript
完美解决UI-Grid表格元素中多个空格显示为一个空格的问题
2017/04/25 Javascript
js轮播图无缝滚动效果
2017/06/17 Javascript
React Native中的RefreshContorl下拉刷新使用
2017/10/09 Javascript
详解JS浏览器事件循环机制
2019/03/27 Javascript
Vue组件基础用法详解
2020/02/05 Javascript
JavaScript通如何过RGraph实现动态仪表盘
2020/10/15 Javascript
vue中使用router全局守卫实现页面拦截的示例
2020/10/23 Javascript
[54:54]Newbee vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
详解python时间模块中的datetime模块
2016/01/13 Python
Python的时间模块datetime详解
2017/04/17 Python
python 将json数据提取转化为txt的方法
2018/10/26 Python
解决Python下imread,imwrite不支持中文的问题
2018/12/05 Python
详解python中@的用法
2019/03/27 Python
python可视化实现KNN算法
2019/10/16 Python
python wav模块获取采样率 采样点声道量化位数(实例代码)
2020/01/22 Python
python相对企业语言优势在哪
2020/06/12 Python
python解决OpenCV在读取显示图片的时候闪退的问题
2021/02/23 Python
关于css兼容性问题及一些常见问题汇总
2016/05/03 HTML / CSS
大学在校生求职信范文
2013/11/21 职场文书
冰淇淋开店创业计划书
2014/02/01 职场文书
在职党员进社区活动总结
2014/07/05 职场文书
群众路线教育实践活动整改落实情况汇报
2014/10/28 职场文书
会议简讯范文
2015/07/20 职场文书
《悬崖边的树》读后感2篇
2019/12/02 职场文书
解决tk mapper 通用mapper的bug问题
2021/06/16 Java/Android
Vue的过滤器你真了解吗
2022/02/24 Vue.js