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 22 Javascript
js中使用DOM复制(克隆)指定节点名数据到新的XML文件中的代码
Jul 27 Javascript
JS验证日期的格式YYYY-mm-dd 具体实现
Jun 29 Javascript
3种js实现string的substring方法
Nov 09 Javascript
下雪了 javascript实现雪花飞舞
Aug 02 Javascript
JavaScript实现隐藏省略文字效果的方法
Apr 27 Javascript
微信小程序实现手指触摸画板
Jul 09 Javascript
在小程序中使用Echart图表的示例代码
Aug 02 Javascript
layui 对弹窗 form表单赋值的实现方法
Sep 04 Javascript
vue实现全屏滚动效果(非fullpage.js)
Mar 07 Javascript
vue 判断两个时间插件结束时间必选大于开始时间的代码
Nov 04 Javascript
关于Vue中的options选项
Mar 22 Vue.js
详解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 中的str_replace 函数总结
2007/04/27 PHP
PHP MemCached高级缓存配置图文教程
2010/08/05 PHP
PHP读取网页文件内容的实现代码(fopen,curl等)
2011/06/23 PHP
探讨fckeditor在Php中的配置详解
2013/06/08 PHP
PHP+Oracle本地开发环境搭建方法详解
2019/04/01 PHP
javascript提取URL的搜索字符串中的参数(自定义函数实现)
2013/01/22 Javascript
javascript常用的正则表达式实例
2014/05/15 Javascript
node.js正则表达式获取网页中所有链接的代码实例
2014/06/03 Javascript
IE中getElementsByName()对有些元素无效的解决方案
2014/09/28 Javascript
Backbone.js的一些使用技巧
2015/07/01 Javascript
详解js图片轮播效果实现原理
2015/12/17 Javascript
jQuery基于cookie实现的购物车实例分析
2015/12/24 Javascript
jQuery日历插件datepicker用法详解
2016/03/03 Javascript
JavaScript利用HTML DOM进行文档操作的方法
2016/03/28 Javascript
webpack配置打包后图片路径出错的解决
2018/04/26 Javascript
不使用JavaScript实现菜单的打开和关闭效果demo
2018/05/01 Javascript
js中Array对象的常用遍历方法详解
2019/01/17 Javascript
vue element 关闭当前tab 跳转到上一路由操作
2020/07/22 Javascript
[10:18]2018DOTA2国际邀请赛寻真——Fnatic能否笑到最后?
2018/08/14 DOTA
Python实现的简单文件传输服务器和客户端
2015/04/08 Python
python 中字典嵌套列表的方法
2018/07/03 Python
Python3爬虫学习之爬虫利器Beautiful Soup用法分析
2018/12/12 Python
Pytorch中的variable, tensor与numpy相互转化的方法
2019/10/10 Python
python dataframe NaN处理方式
2019/12/26 Python
Pycharm配置PyQt5环境的教程
2020/04/02 Python
pycharm下pyqt4安装及环境配置的教程
2020/04/24 Python
基于Keras 循环训练模型跑数据时内存泄漏的解决方式
2020/06/11 Python
用python实现前向分词最大匹配算法的示例代码
2020/08/06 Python
Python实现扫码工具的示例代码
2020/10/09 Python
赞美老师的演讲稿
2014/05/22 职场文书
工厂仓管员岗位职责
2015/04/01 职场文书
资金申请报告范文
2015/05/14 职场文书
2016年妇联“6﹒26国际禁毒日”宣传活动总结
2016/04/05 职场文书
golang在GRPC中设置client的超时时间
2021/04/27 Golang
JavaScript原始值与包装对象的详细介绍
2021/05/11 Javascript
关于MySQL中的 like操作符详情
2021/11/17 MySQL