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 面向对象编程
Oct 28 Javascript
url 特殊字符 传递参数解决方法
Jan 01 Javascript
JS控制显示隐藏兼容问题(IE6、IE7、IE8)
Apr 01 Javascript
jQuery源码分析-02正则表达式 RegExp 常用正则表达式
Nov 14 Javascript
js设置document.domain实现跨域的注意点分析
May 21 Javascript
ES6中class类用法实例浅析
Apr 06 Javascript
微信小程序中显示html格式内容的方法
Apr 25 Javascript
Bootstrap Table实现定时刷新数据的方法
Aug 13 Javascript
对angularJs中$sce服务安全显示html文本的实例
Sep 30 Javascript
JS扁平化输出数组的2种方法解析
Sep 17 Javascript
vue prop传值类型检验方式
Jul 30 Javascript
echarts浮动显示单位的实现方法示例
Dec 04 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去除重复字的实现代码
2011/09/16 PHP
解析用PHP实现var_export的详细介绍
2013/06/20 PHP
完美解决PHP中的Cannot modify header information 问题
2013/08/12 PHP
php生成随机密码自定义函数代码(简单快速)
2014/05/10 PHP
php显示时间常用方法小结
2015/06/05 PHP
yii使用bootstrap分页样式的实例
2017/01/17 PHP
PHP实现在数据库百万条数据中随机获取20条记录的方法
2017/04/19 PHP
PHP 7.1中AES加解密方法mcrypt_module_open()的替换方案
2017/10/17 PHP
CSS(js)限制页面显示的文本字符长度
2012/12/27 Javascript
JavaScript中访问节点对象的方法有哪些如何使用
2013/09/24 Javascript
js时间戳格式化成日期格式的多种方法
2013/11/11 Javascript
Javascript中的Array数组对象详谈
2014/03/03 Javascript
实现checkbox全选、反选、取消JavaScript小脚本异常
2014/04/10 Javascript
基于zepto.js实现仿手机QQ空间的大图查看组件ImageView.js详解
2015/03/05 Javascript
js获取微信版本号的方法
2015/05/12 Javascript
JQuery学习总结【二】
2016/12/01 Javascript
B/S(Web)实时通讯解决方案分享
2017/04/06 Javascript
js实现延迟加载的几种方法
2017/04/24 Javascript
24行JavaScript代码实现Redux的方法实例
2019/11/17 Javascript
js实现验证码干扰(静态)
2021/02/22 Javascript
[01:47]2018年度DOTA2最具人气解说-完美盛典
2018/12/16 DOTA
下载安装setuptool和pip linux安装pip    
2014/01/24 Python
Python随机生成数模块random使用实例
2015/04/13 Python
Python基于sftp及rsa密匙实现远程拷贝文件的方法
2016/09/21 Python
django session完成状态保持的方法
2018/11/27 Python
pycharm激活码快速激活及使用步骤
2020/03/12 Python
python中元组的用法整理
2020/06/15 Python
Python3爬虫中识别图形验证码的实例讲解
2020/07/30 Python
域名注册、建站工具、网页主机、SSL证书:Dynadot
2017/01/06 全球购物
如何将整数int转换成字串String
2014/03/21 面试题
函数指针的定义是什么
2016/08/14 面试题
2014婚礼司仪主持词
2014/03/14 职场文书
学雷锋献爱心倡议书
2015/04/27 职场文书
工会文体活动总结
2015/05/07 职场文书
2021年最新用于图像处理的Python库总结
2021/06/15 Python
Apache Pulsar集群搭建部署详细过程
2022/02/12 Servers