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 EasyUI API 中文文档 - Menu菜单
Oct 03 Javascript
javascript学习笔记(十二) RegExp类型介绍
Jun 20 Javascript
js脚本实现数据去重
Nov 27 Javascript
js+ajax实现获取文件大小的方法
Dec 08 Javascript
html判断当前页面是否在iframe中的实例
Nov 30 Javascript
Node.js复制文件的方法示例
Dec 29 Javascript
JavaScript实现自定义媒体播放器方法介绍
Jan 03 Javascript
Javascript中toFixed计算错误(依赖银行家舍入法的缺陷)解决方法
Aug 22 Javascript
vue实现文章内容过长点击阅读全文功能的实例
Dec 28 Javascript
生产制造追溯系统之在线打印功能
Jun 03 Javascript
Vue.set 全局操作简单示例
Sep 19 Javascript
Node.js API详解之 os模块用法实例分析
May 06 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代码技巧的小结
2013/06/02 PHP
获取php页面执行时间,数据库读写次数,函数调用次数等(THINKphp)
2013/06/03 PHP
深入PHP购物车模块功能分析(函数讲解,附源码)
2013/06/25 PHP
Yii控制器中filter过滤器用法分析
2016/07/15 PHP
php设计模式之策略模式实例分析【星际争霸游戏案例】
2020/03/26 PHP
JS控制表格隔行变色
2006/06/26 Javascript
js不完美解决click和dblclick事件冲突问题
2012/07/16 Javascript
JavaScript操作HTML DOM节点的基础教程
2016/03/11 Javascript
JavaScript必知必会(十) call apply bind的用法说明
2016/06/08 Javascript
js print打印网页指定区域内容的简单实例
2016/11/01 Javascript
Vue.js第四天学习笔记
2016/12/02 Javascript
js控制一个按钮是否可点击(可使用)disabled的实例
2017/02/14 Javascript
js判断传入时间和当前时间大小实例(超简单)
2018/01/11 Javascript
Nuxt.js SSR与权限验证的实现
2018/11/21 Javascript
微信小程序实现的一键拨号功能示例
2019/04/24 Javascript
vue路由守卫及路由守卫无限循环问题详析
2019/09/05 Javascript
js实现带搜索功能的下拉框
2020/01/11 Javascript
Ajax获取node服务器数据的完整步骤
2020/09/20 Javascript
python标准日志模块logging的使用方法
2013/11/01 Python
对于Python的Django框架使用的一些实用建议
2015/04/03 Python
ubuntu安装sublime3并配置python3环境的方法
2018/03/15 Python
用python 批量更改图像尺寸到统一大小的方法
2018/03/31 Python
python获取文件路径、文件名、后缀名的实例
2018/04/23 Python
pybind11在Windows下的使用教程
2019/07/04 Python
基于Python的OCR实现示例
2020/04/03 Python
浅谈python处理json和redis hash的坑
2020/07/16 Python
利用python实现汉诺塔游戏
2021/03/01 Python
使用CSS3配合IE滤镜实现渐变和投影的效果
2015/09/06 HTML / CSS
Arti-shopping中文官网:大型海外商品一站式直邮平台
2020/03/23 全球购物
英语课前三分钟演讲稿
2014/08/19 职场文书
物流专业专科生职业生涯规划书
2014/09/14 职场文书
家长高考寄语
2015/02/27 职场文书
煤矿安全保证书
2015/02/27 职场文书
护理工作个人总结
2015/03/03 职场文书
2015年社区国庆节活动总结
2015/07/30 职场文书
Win11安装受阻怎么办? Windows11安装问题与解决方案汇总
2021/11/21 数码科技