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 相关文章推荐
那些年,我还在学习jquery 学习笔记
Mar 05 Javascript
javascript中打印当前的时间实现思路及代码
Dec 18 Javascript
javascript内置对象操作详解
Feb 04 Javascript
javascript数据结构与算法之检索算法
Apr 04 Javascript
JS实现按比例缩放图片的方法(附C#版代码)
Dec 08 Javascript
js+canvas绘制五角星的方法
Jan 28 Javascript
Vue.js实现列表清单的操作方法
Nov 15 Javascript
JavaScript解决浮点数计算不准确问题的方法分析
Jul 09 Javascript
微信小程序自定义带价格显示日历效果
Dec 29 Javascript
vscode配置vue下的es6规范自动格式化详解
Mar 20 Javascript
解决Vue中 父子传值 数据丢失问题
Aug 27 Javascript
微信小程序调用后台service教程详解
Nov 06 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中curl、fsockopen的应用
2016/12/10 PHP
图像替换新技术 状态域方法
2010/01/28 Javascript
用JS判断IE版本的代码 超管用!
2011/08/09 Javascript
基于jquery的鼠标拖动效果代码
2012/05/30 Javascript
js获取当前路径的简单示例代码
2014/01/08 Javascript
在Python中使用glob模块查找文件路径的方法
2015/06/17 Javascript
JavaScript常用基础知识强化学习
2015/12/09 Javascript
详解基于webpack搭建react运行环境
2017/06/01 Javascript
详解如何构建Angular项目目录结构
2017/07/13 Javascript
Spring boot 和Vue开发中CORS跨域问题解决
2018/09/05 Javascript
[01:20:06]TNC vs VG 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
python调用cmd复制文件代码分享
2013/12/27 Python
用Python展示动态规则法用以解决重叠子问题的示例
2015/04/02 Python
举例讲解Python中装饰器的用法
2015/04/27 Python
详解JavaScript编程中的window与window.screen对象
2015/10/26 Python
python使用json序列化datetime类型实例解析
2018/02/11 Python
Python 实现将数组/矩阵转换成Image类
2020/01/09 Python
tensorflow 分类损失函数使用小记
2020/02/18 Python
html5 初试 indexedDB(推荐)
2016/07/21 HTML / CSS
Mio Skincare中文官网:肌肤和身体护理
2016/10/26 全球购物
复古风格的女装和装饰品:ModCloth
2017/12/29 全球购物
泰国综合购物网站:Lazada泰国
2018/04/09 全球购物
KEEN美国官网:美国人气户外休闲鞋品牌
2021/03/09 全球购物
西式婚礼证婚词
2014/01/12 职场文书
敬老文明号事迹材料
2014/01/16 职场文书
幼儿园家长评语
2014/02/10 职场文书
中文教师求职信
2014/02/22 职场文书
退休教师欢送会主持词
2014/03/31 职场文书
职工擅自离岗检讨书
2014/09/23 职场文书
2014银行领导班子四风对照检查材料思想汇报
2014/09/25 职场文书
2014年班长个人工作总结
2014/11/14 职场文书
承诺书范本大全
2015/05/04 职场文书
给朋友的道歉短信
2015/05/12 职场文书
反邪教教育心得体会
2016/01/15 职场文书
2019预备党员转正申请书模板2篇!
2019/08/07 职场文书
Win11任务栏无法正常显示 资源管理器不停重启的解决方法
2022/07/07 数码科技