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 01 Javascript
利用javascript移动div层-javascript 拖动层
Mar 22 Javascript
jQuery 1.7.2中getAll方法的疑惑分析
May 23 Javascript
Js日期选择自动填充到输入框(界面漂亮兼容火狐)
Aug 02 Javascript
2014 HTML5/CSS3热门动画特效TOP10
Dec 07 Javascript
Node.js连接postgreSQL并进行数据操作
Dec 18 Javascript
轻松理解JavaScript之AJAX
Mar 15 Javascript
angular2中router路由跳转navigate的使用与刷新页面问题详解
May 07 Javascript
javascript中new Array()和var arr=[]用法区别
Dec 01 Javascript
解决vue单页路由跳转后scrollTop的问题
Sep 03 Javascript
vue 基于element-ui 分页组件封装的实例代码
Dec 10 Javascript
layui表格内容溢出的解决方法
Sep 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 Header用于页面跳转时的几个注意事项
2016/10/21 PHP
PHP实现生成推广海报的方法详解
2018/03/14 PHP
PHP5.5新特性之yield理解与用法实例分析
2019/01/11 PHP
PHP实现笛卡尔积算法的实例讲解
2019/12/22 PHP
javascript实现动态CSS换肤技术的脚本
2007/06/29 Javascript
Prototype 学习 工具函数学习($A方法)
2009/07/12 Javascript
JavaScript 继承详解(三)
2009/07/13 Javascript
jquery 回车事件实现代码
2011/08/23 Javascript
排序算法的javascript实现与讲解(99js手记)
2014/09/28 Javascript
JavaScript中的return语句简单介绍
2015/12/07 Javascript
AngularJS 简单应用实例
2016/07/28 Javascript
jquery.guide.js新版上线操作向导镂空提示jQuery插件(推荐)
2017/05/20 jQuery
解决Extjs下拉框不显示的问题
2017/06/21 Javascript
收藏AngularJS中最重要的核心功能
2017/07/09 Javascript
js Math数学简单使用操作示例
2020/03/13 Javascript
vue2.x 对象劫持的原理实现
2020/04/19 Javascript
[45:10]NB vs Liquid Supermajor小组赛 A组胜者组决赛 BO3 第二场 6.2
2018/06/04 DOTA
[48:31]DOTA2-DPC中国联赛 正赛 Dynasty vs XG BO3 第一场 2月2日
2021/03/11 DOTA
简单的抓取淘宝图片的Python爬虫
2014/12/25 Python
Python六大开源框架对比
2015/10/19 Python
python中input()与raw_input()的区别分析
2016/02/27 Python
python模块之time模块(实例讲解)
2017/09/13 Python
python利用高阶函数实现剪枝函数
2018/03/20 Python
python多任务及返回值的处理方法
2019/01/22 Python
强悍的Python读取大文件的解决方案
2019/02/16 Python
11个Python3字典内置方法大全与示例汇总
2019/05/13 Python
django url到views参数传递的实例
2019/07/19 Python
OpenCV Python实现图像指定区域裁剪
2021/03/12 Python
python 利用toapi库自动生成api
2020/10/19 Python
快速实现一个简单的canvas迷宫游戏的示例
2018/07/04 HTML / CSS
浅析canvas元素的html尺寸和css尺寸对元素视觉的影响
2019/07/22 HTML / CSS
this关键字的含义
2015/04/08 面试题
幼儿园开学寄语
2014/04/03 职场文书
2014向国旗敬礼网上签名活动总结
2014/09/27 职场文书
2015年董事长秘书工作总结
2015/07/23 职场文书
反四风问题学习心得体会
2016/01/22 职场文书