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 字符编码规则
May 04 Javascript
jQuery-ui中自动完成实现方法
Jun 10 Javascript
IE6下focus与blur错乱的解决方案
Jul 31 Javascript
bootstrap modal弹出框的垂直居中
Dec 14 Javascript
AngularJS定时器的使用与移除操作方法【interval与timeout】
Dec 14 Javascript
BootStrap selectpicker后台动态绑定数据
Jun 01 Javascript
vue如何获取点击事件源的方法
Aug 10 Javascript
angularJS实现不同视图同步刷新详解
Oct 09 Javascript
简单学习5种处理Vue.js异常的方法
Jun 17 Javascript
jquery插件开发模式实例详解
Jul 20 jQuery
Vue+Spring Boot简单用户登录(附Demo)
Nov 12 Javascript
原生JS实现拖拽功能
Dec 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
example1.php
2006/10/09 PHP
PHP操作FTP类 (上传、下载、移动、创建等)
2016/03/31 PHP
PHP序列化的四种实现方法与横向对比
2018/11/29 PHP
js客户端快捷键管理类的较完整实现和应用
2010/06/08 Javascript
jQuery Migrate 1.1.0 Released 注意事项
2014/06/14 Javascript
Nodejs为什么选择javascript为载体语言
2015/01/13 NodeJs
IE下支持文本框和密码框placeholder效果的JQuery插件分享
2015/01/31 Javascript
JavaScript数组的栈方法与队列方法详解
2016/05/26 Javascript
在JSP中如何实现MD5加密的方法
2016/11/02 Javascript
JavaScript严格模式详解
2017/01/16 Javascript
jQuery实现模糊查询的方法分析
2018/05/10 jQuery
详解Vue前端对axios的封装和使用
2019/04/01 Javascript
[16:04]DOTA2海涛带你玩炸弹 9月5日更新内容详解
2014/09/05 DOTA
python连接sql server乱码的解决方法
2013/01/28 Python
python的keyword模块用法实例分析
2015/06/30 Python
详解Django中的权限和组以及消息
2015/07/23 Python
python实现二叉树的遍历
2017/12/11 Python
python 移除字符串尾部的数字方法
2018/07/17 Python
Python利用神经网络解决非线性回归问题实例详解
2019/07/19 Python
python爬虫开发之使用python爬虫库requests,urllib与今日头条搜索功能爬取搜索内容实例
2020/03/10 Python
五分钟带你搞懂python 迭代器与生成器
2020/08/30 Python
python绘图模块之利用turtle画图
2021/02/12 Python
CSS3中引入多种自定义字体font-face
2020/06/12 HTML / CSS
HTML5 FormData 方法介绍以及实现文件上传示例
2017/09/12 HTML / CSS
美国老牌主机服务商:iPage
2016/07/22 全球购物
汉森批发:Hansen Wholesale
2018/05/24 全球购物
介绍一下Linux内核的排队自旋锁
2014/01/04 面试题
小学生家长评语大全
2014/02/10 职场文书
宾馆总经理岗位职责
2014/02/14 职场文书
优秀应届毕业生自荐书
2014/06/29 职场文书
转让协议书范本
2014/09/13 职场文书
镇党政领导班子民主生活会思想汇报
2014/10/11 职场文书
2014年园林绿化工作总结
2014/12/11 职场文书
介绍信如何写
2015/01/31 职场文书
计划生育工作总结2015
2015/04/03 职场文书
紧急迫降观后感
2015/06/15 职场文书