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文件的小脚本
Jun 28 Javascript
javascript 自定义事件初探
Aug 21 Javascript
javascript 获取页面的高度及滚动条的位置的代码
May 06 Javascript
一个页面元素appendchild追加到另一个页面元素的问题
Jan 27 Javascript
利用js实现选项卡的特别效果的实例
Mar 03 Javascript
jquery 倒计时效果实现秒杀思路
Sep 11 Javascript
jquery ajax 局部刷新小案例
Feb 08 Javascript
JS获取当前脚本文件的绝对路径
Mar 02 Javascript
Bootstrap表单组件教程详解
Apr 26 Javascript
Bootstrap实现渐变顶部固定自适应导航栏
Aug 27 Javascript
JavaScript实现的浏览器下载文件的方法
Aug 09 Javascript
在vue中使用vant TreeSelect分类选择组件操作
Nov 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
Yii 2.0实现联表查询加搜索分页的方法示例
2017/08/02 PHP
php intval函数用法总结
2019/04/14 PHP
php实现快速对二维数组某一列进行组装的方法小结
2019/12/04 PHP
如何实现iframe(嵌入式帧)的自适应高度
2006/07/26 Javascript
Js 时间间隔计算的函数(间隔天数)
2011/11/15 Javascript
javascript判断iphone/android手机横竖屏模式的函数
2011/12/20 Javascript
jqeury-easyui-layout问题解决方法
2014/03/24 Javascript
jquery获取form表单input元素值的简单实例
2016/05/30 Javascript
sencha ext js 6 快速入门(必看)
2016/06/01 Javascript
简易的JS计算器实现代码
2016/10/18 Javascript
webpack学习笔记之优化缓存、合并、懒加载
2017/08/24 Javascript
vue 1.x 交互实现仿百度下拉列表示例
2017/10/21 Javascript
vue 根据数组中某一项的值进行排序的方法
2018/08/30 Javascript
微信小程序如何自定义table组件
2019/06/29 Javascript
node.js域名解析实现方法详解
2019/11/05 Javascript
JS常见错误(Error)及处理方案详解
2020/07/02 Javascript
[03:12]完美世界DOTA2联赛PWL DAY9集锦
2020/11/10 DOTA
python清除指定目录内所有文件中script的方法
2015/06/30 Python
Python的Django框架中if标签的相关使用
2015/07/15 Python
Python闭包的两个注意事项(推荐)
2017/03/20 Python
PyQt5通信机制 信号与槽详解
2019/08/07 Python
tensorflow2.0与tensorflow1.0的性能区别介绍
2020/02/07 Python
改变 Python 中线程执行顺序的方法
2020/09/24 Python
python+selenium实现12306模拟登录的步骤
2021/01/21 Python
亚洲领先的旅游体验市场:Voyagin
2019/11/23 全球购物
PHP高级工程师面试问题推荐
2013/01/18 面试题
中海讯通笔试题
2015/09/15 面试题
工商学院毕业生个人自我评价
2013/09/19 职场文书
市场营销个人求职信范文
2014/02/02 职场文书
民主生活会发言材料
2014/10/20 职场文书
大学生学期个人总结
2015/02/12 职场文书
初中家长意见
2015/06/03 职场文书
小学课改工作总结
2015/08/13 职场文书
Go遍历struct,map,slice的实现
2021/06/13 Golang
聊一聊Redis与MySQL双写一致性如何保证
2021/06/26 Redis
Python内置数据结构列表与元组示例详解
2021/08/04 Python