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中的浮点型运算问题
Jan 06 Javascript
Javascript中的String对象详谈
Mar 03 Javascript
jQuery实现的点赞随机数字显示动画效果(附在线演示与demo源码下载)
Dec 31 Javascript
Jquery获取radio选中的值
May 05 jQuery
jquery基于layui实现二级联动下拉选择(省份城市选择)
Jun 20 jQuery
es6系列教程_ Map详解以及常用api介绍
Sep 25 Javascript
vue.js 底部导航栏 一级路由显示 子路由不显示的解决方法
Mar 09 Javascript
基于mpvue的简单弹窗组件mptoast使用详解
Aug 02 Javascript
微信小程序中为什么使用var that=this
Aug 27 Javascript
js 闭包深入理解与实例分析
Mar 19 Javascript
vue@cli3项目模板怎么使用public目录下的静态文件
Jul 07 Javascript
vue实现顶部菜单栏
Nov 08 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中的session永不过期的解决思路及实现方法分享
2011/04/20 PHP
Mac版PhpStorm之XAMPP整合apache服务器配置的图文教程详解
2016/10/13 PHP
Laravel框架使用Seeder实现自动填充数据功能
2018/06/13 PHP
ThinkPHP框架实现FTP图片上传功能示例
2019/04/08 PHP
JQuery的html(data)方法与<script>脚本块的解决方法
2010/03/09 Javascript
JS判断当前日期是否大于某个日期的实现代码
2012/09/02 Javascript
javascript生成随机大小写字母的方法
2014/02/20 Javascript
使用Node.js实现一个简单的FastCGI服务器实例
2014/06/09 Javascript
jQuery打印图片pdf、txt示例代码
2014/07/22 Javascript
AngularJS转换响应内容
2016/01/27 Javascript
javascript插件开发的一些感想和心得
2016/02/28 Javascript
js style.display=block显示布局错乱问题的解决方法
2016/09/21 Javascript
jQuery DateTimePicker 日期和时间插件示例
2017/01/22 Javascript
async/await与promise(nodejs中的异步操作问题)
2017/03/03 NodeJs
jquery仿苹果的时间/日期选择效果
2017/03/08 Javascript
微信小程序 数据绑定及运算的简单实例
2017/09/20 Javascript
vue 数组和对象不能直接赋值情况和解决方法(推荐)
2017/10/25 Javascript
如何在Vue.JS中使用图标组件
2020/08/04 Javascript
NodeJS和浏览器中this关键字的不同之处
2021/03/03 NodeJs
Python实现删除Android工程中的冗余字符串
2015/01/19 Python
Python中的字符串替换操作示例
2016/06/27 Python
使用python验证代理ip是否可用的实现方法
2018/07/25 Python
基于Python实现用户管理系统
2019/02/26 Python
ML神器:sklearn的快速使用及入门
2019/07/11 Python
关于ZeroMQ 三种模式python3实现方式
2019/12/23 Python
Hawes & Curtis澳大利亚官网:英国经典服饰品牌
2018/10/29 全球购物
英国空调、除湿机和通风设备排名第一:Air Con Centre
2019/02/25 全球购物
护理专业毕业生自我鉴定
2013/10/08 职场文书
最新计算机专业自荐信
2013/10/16 职场文书
内科护士实习自我鉴定
2013/10/17 职场文书
团队拓展活动方案
2014/08/28 职场文书
财务总监岗位职责范本
2015/04/03 职场文书
2015年七年级班主任工作总结
2015/05/21 职场文书
关于Javascript闭包与应用的详解
2021/04/22 Javascript
CentOS7环境下MySQL8常用命令小结
2022/06/10 Servers
使用CSS实现六边形的图片效果
2022/08/05 HTML / CSS