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 相关文章推荐
JS+CSS设置img在DIV中只显示Img垂直居中的部分
Oct 24 Javascript
js螺旋动画效果的具体实例
Nov 15 Javascript
JS实现点击上移下移LI行数据的方法
Aug 05 Javascript
基于jQuery实现仿百度首页换肤背景图片切换代码
Aug 25 Javascript
jQuery选择器基础入门教程
May 10 Javascript
layui弹出层效果实现代码
May 19 Javascript
vue+axios实现登录拦截的实例代码
May 22 Javascript
深入理解Angular中的依赖注入
Jun 26 Javascript
详解微信小程序Radio选中样式切换
Jul 06 Javascript
使用vue-resource进行数据交互的实例
Sep 02 Javascript
Angular4集成ng2-file-upload的上传组件
Mar 14 Javascript
纯js+css实现仿移动端淘宝网站的弹出详情框功能
Dec 29 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:风雨欲来 路在何方?
2006/10/09 PHP
基于mysql的论坛(7)
2006/10/09 PHP
php5.2时间相差8小时
2007/01/15 PHP
PHP 事件机制(2)
2011/03/23 PHP
php DOS攻击实现代码(附如何防范)
2012/05/29 PHP
解析Linux下Varnish缓存的配置优化
2013/06/20 PHP
PHP函数http_build_query使用详解
2014/08/20 PHP
PHP date()函数警告: It is not safe to rely on the system解决方法
2014/08/20 PHP
PHP面向对象程序设计之多态性的应用示例
2018/12/19 PHP
在 Laravel 中动态隐藏 API 字段的方法
2019/10/25 PHP
PHP后门隐藏的一些技巧总结
2020/11/04 PHP
CSS JavaScript 实现菜单功能 改进版
2008/12/09 Javascript
解决IE6的PNG透明JS插件使用介绍
2013/04/17 Javascript
模拟多级复选框效果的jquery代码
2013/08/13 Javascript
javascript删除元素节点removeChild()用法实例
2015/05/26 Javascript
JavaScript Date对象详解
2016/03/01 Javascript
详解EasyUi控件中的Datagrid
2017/08/23 Javascript
JavaScript如何对图片进行黑白化
2018/04/10 Javascript
jsonp格式前端发送和后台接受写法的代码详解
2019/11/07 Javascript
Python之reload流程实例代码解析
2018/01/29 Python
浅谈python numpy中nonzero()的用法
2018/04/02 Python
python pygame模块编写飞机大战
2018/11/20 Python
python 两个数据库postgresql对比
2019/10/21 Python
python词云库wordcloud的使用方法与实例详解
2020/02/17 Python
python爬取youtube视频的示例代码
2021/03/03 Python
Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型
2013/10/30 面试题
学生处主任岗位职责
2013/12/01 职场文书
法警的竞聘演讲稿
2014/01/02 职场文书
初中数学教学反思
2014/01/16 职场文书
县优秀教师事迹材料
2014/01/31 职场文书
幼儿教师研修感言
2014/02/12 职场文书
上班玩手机检讨书
2014/02/17 职场文书
艾滋病宣传标语
2014/06/25 职场文书
农村门前三包责任书
2014/07/25 职场文书
捐款感谢信
2015/01/20 职场文书
Pytorch 实现变量类型转换
2021/05/17 Python