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 选择器理解
Mar 16 Javascript
扩展javascript的Date方法实现代码(prototype)
Nov 20 Javascript
这段js代码得节约你多少时间
Dec 20 Javascript
原生javascript实现DIV拖拽并计算重复面积
Jan 02 Javascript
jQuery原生的动画效果
Jul 10 Javascript
JS 事件绑定、事件监听、事件委托详细介绍
Sep 28 Javascript
vue.js 使用v-if v-else发现没有执行解决办法
May 15 Javascript
详解vue服务端渲染(SSR)初探
Jun 19 Javascript
浅谈Angular6的服务和依赖注入
Jun 27 Javascript
ES6 更易于继承的类语法的使用
Feb 11 Javascript
vue-router二级导航切换路由及高亮显示的实现方法
Jul 10 Javascript
2020京东618叠蛋糕js脚本(亲测好用)
Jun 02 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读取纯真ip数据库使用示例
2014/01/26 PHP
PHP实现的英文名字全拼随机排号脚本
2014/07/04 PHP
php遍历删除整个目录及文件的方法
2015/03/13 PHP
PHP加密解密实例分析
2015/12/25 PHP
PHP超全局变量实现原理及代码解析
2020/09/01 PHP
php实现简单四则运算器
2020/11/29 PHP
JQuery从头学起第一讲
2010/07/04 Javascript
javascript设置金额样式转换保留两位小数示例代码
2013/12/04 Javascript
javaScript如何生成xmlhttp
2013/12/16 Javascript
通过正则表达式实现表单验证是否为中文
2014/02/18 Javascript
多种方法实现360浏览器下禁止自动填写用户名密码
2014/06/16 Javascript
浅谈jquery事件处理
2015/04/24 Javascript
详解Wondows下Node.js使用MongoDB的环境配置
2016/03/01 Javascript
不同js异步函数同步的实现方法
2016/05/28 Javascript
javascript日期比较方法实例分析
2016/06/17 Javascript
jQuery插件HighCharts绘制的2D堆柱状图效果示例【附demo源码下载】
2017/03/14 Javascript
AngularJS实现的select二级联动下拉菜单功能示例
2017/10/25 Javascript
jQuery.Sumoselect插件实现下拉复选框效果
2017/11/09 jQuery
基于vue循环列表时点击跳转页面的方法
2018/08/31 Javascript
Vue实现移动端左右滑动效果的方法
2018/11/27 Javascript
小程序实现人脸识别功能(百度ai)
2018/12/23 Javascript
在vue项目中使用sass语法问题
2019/07/18 Javascript
关于vue利用postcss-pxtorem进行移动端适配的问题
2019/11/20 Javascript
react组件基本用法示例小结
2020/04/27 Javascript
[38:54]完美世界DOTA2联赛PWL S2 Rebirth vs LBZS 第一场 11.28
2020/12/01 DOTA
Python写的Socks5协议代理服务器
2014/08/06 Python
Python采用Django制作简易的知乎日报API
2016/08/03 Python
python scrapy爬虫代码及填坑
2019/08/12 Python
python PIL/cv2/base64相互转换实例
2020/01/09 Python
使用CSS3制作饼状旋转载入效果的实例
2015/06/23 HTML / CSS
俄罗斯香水和化妆品购物网站:Л’Этуаль
2018/05/10 全球购物
交通事故赔偿协议书
2014/04/15 职场文书
2014年基层党建工作总结
2014/11/11 职场文书
2015新学期家长寄语
2015/02/26 职场文书
房地产财务经理岗位职责
2015/04/08 职场文书
详解MySQL连接挂死的原因
2021/05/18 MySQL