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实现漂亮的拖动层,窗口拖拽特效
Apr 24 Javascript
简介JavaScript中Boolean.toSource()方法的使用
Jun 05 Javascript
jquery在ie7下选择器的问题导致append失效的解决方法
Jan 10 Javascript
JavaScript正则表达式小结(test|match|search|replace|split|exec)
Dec 08 Javascript
Vue2.0 http请求以及loading展示实例
Mar 06 Javascript
使用p5.js实现动态GIF图片临摹重现
Oct 23 Javascript
es6中new.target的作用和使用场景简单示例分析
Mar 14 Javascript
微信小程序开发(三):返回上一级页面并刷新操作示例【页面栈】
Jun 01 Javascript
基于Vue全局组件与局部组件的区别说明
Aug 11 Javascript
JavaScript数组排序的六种常见算法总结
Aug 18 Javascript
JavaScript代码实现微博批量取消关注功能
Feb 05 Javascript
AngularJS实现多级下拉框
Mar 25 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
基于mysql的bbs设计(三)
2006/10/09 PHP
PHP面向对象学习笔记之一 基础概念
2012/10/06 PHP
基于PHP生成静态页的实现方法
2013/05/10 PHP
多个PHP中文字符串截取函数
2013/11/12 PHP
修改apache配置文件去除thinkphp url中的index.php
2014/01/17 PHP
简单的php+mysql聊天室实现方法(附源码)
2016/01/05 PHP
PHP基于自定义函数生成笛卡尔积的方法示例
2017/09/30 PHP
PHP通过调用新浪API生成t.cn格式短网址链接的方法详解
2019/02/20 PHP
ExtJs 3.1 XmlTreeLoader Example Error
2010/02/09 Javascript
解析Jquery中如何把一段html代码动态写入到DIV中(实例说明)
2013/07/09 Javascript
js实现鼠标触发图片抖动效果的方法
2015/02/27 Javascript
JS表格组件BootstrapTable行内编辑解决方案x-editable
2016/09/01 Javascript
详解vue-cli 构建Vue项目遇到的坑
2017/08/30 Javascript
Vue-router结合transition实现app前进后退动画切换效果的实例
2017/10/11 Javascript
Vue.JS项目中5个经典Vuex插件
2017/11/28 Javascript
小程序视频或音频自定义可拖拽进度条的示例代码
2018/09/30 Javascript
从0到1搭建element后台框架优化篇(打包优化)
2019/05/12 Javascript
vue使用websocket的方法实例分析
2019/06/22 Javascript
layui下拉框获取下拉值(select)的例子
2019/09/10 Javascript
Javascript基于OOP实实现探测器功能代码实例
2020/08/26 Javascript
Python使用Matplotlib实现雨点图动画效果的方法
2017/12/23 Python
Django JWT Token RestfulAPI用户认证详解
2019/01/23 Python
Flask项目中实现短信验证码和邮箱验证码功能
2019/12/05 Python
Python坐标轴操作及设置代码实例
2020/06/04 Python
matplotlib 生成的图像中无法显示中文字符的解决方法
2020/06/10 Python
python图片验证码识别最新模块muggle_ocr的示例代码
2020/07/03 Python
荷兰男士时尚网上商店:Suitable
2017/12/25 全球购物
Martinelli官方商店:西班牙皮鞋和高跟鞋品牌
2019/07/30 全球购物
总经理办公室主任岗位职责
2013/11/12 职场文书
市场营销专科应届生求职信
2013/11/24 职场文书
信息学院毕业生自荐信范文
2014/03/04 职场文书
保险内勤岗位职责
2014/04/05 职场文书
劳资协议书范本
2014/04/23 职场文书
公司授权委托书格式样本
2014/10/01 职场文书
村党的群众路线教育实践活动工作总结
2014/10/25 职场文书
整理Python中常用的conda命令操作
2021/06/15 Python