博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Zepto源码分析(1)——类型判断函数
阅读量:6337 次
发布时间:2019-06-22

本文共 3053 字,大约阅读时间需要 10 分钟。

hot3.png

本文主要分析Zepto库的类型判断函数typeof,使用Zepto版本为 V.1.6.7。

先来看Zepto中对typeof()函数的实现

    var $,        class2type={},        toString = class2type.toString    //判断obj的类型,返回类型字符串 null | undefined | string | number | boolean | object | function | array | regexp | date | error    function type(obj){        return obj == null ? String(obj):class2type[toString.call(obj)] || 'object';    }    function likeArray(obj){ return typeof(obj.length) == 'number'}//判断是否是数组相似对象    $.each = function(elements, callback) {        var i,key;        if(likeArray(elements)){//遍历数组相似对象            for(i=0;i

首先定义了class2type对象,并赋值toString=class2type.toString,实际上toString引用了Object.prototype.toString.

Object.prototype.toString(obj)时object的基础方法,其功能为返回对象的字符串表示,可参考以下代码

        function Person(name,age,sex){            this.name = name;            this.age = age;            this .sex = sex;        }        var p = new Person("Jack",21,"male");        var class2type = {}, toString = class2type.toString;        console.log(toString.call(p))        console.log(toString.call(Person))        console.log(toString.call("hello world"))        console.log(toString.call(true))        console.log(toString.call(new Array()))        console.log(toString.call(null))        console.log(toString.call(1))        console.log(toString.call(undefined))        console.log(toString.call(/^d{3}$/))        console.log(toString.call(new Date()))        console.log(toString.call(new Error()))

其返回值为

[object Object][object Function][object String][object Boolean][object Array][object Null][object Number][object Undefined][object RegExp][object Date][object Error]

可以看到对于 对象,函数,字符串,布尔值,数组,空类型,数字,未定义,正则表达式,日期,错误,Object.prototype.toString()方法都能返回相应的字符串[object Type]

Zepto实现了$.each()方法,用于遍历数组和对象,并对其元素执行定义好的回调函数(使用jquery和zepto的童靴对这个应该都熟)

$.each(obj)方法的实现思路很简单,如果参数obj存在length属性,那么判断其为数组,进行遍历并调用回调函数,若回调函数返回false,那么终止后续遍历。如果参数obj无length属性,判断其为object,并使用for...in遍历

    $.each("Boolean Number String Function Object Array Date RegExp Error".split(" "),function(i,name){        class2type["[object " + name + "]"] = name.toLowerCase();    })

上述函数在class2type对象上构建了各个类型的映射,class2type的值为

   {    [object Array]:"array",    [object Boolean]:"boolean"    ,    [object Date]:"date"    ,    [object Error]:"error",        [object Function]:"function"    ,    [object Number]:"number"    ,    [object Object]:"object"    ,    [object RegExp]:"regexp"    ,    [object String]:"string"  }

可以看到class2type对象中未存储[object Null]和[object Undefined],所以在type()函数中首先使用obj==null判断了是否是null或者undefined,

如果obj==null为true,使用String(null)和String(undefined)分别返回null和undefined

如果obj==null为false, 使用class2type(toString().call(obj))返回class2type中存储的属性值

string | number | boolean | object | function | array | regexp | date | error

如果class2type中查找不到的类型,那么判断其为object类型。

综上所述,Zepto的type()方法能够识别

null | undefined | string | number | boolean | object | function | array | regexp | date | error

共计11种类型。

对比javascript提供的typeof只能识别 number | string | boolean | object | undefined | function 六种类型。

以上!

转载于:https://my.oschina.net/u/2519698/blog/530424

你可能感兴趣的文章
CentOS 6.5下编译安装新版LNMP
查看>>
Android Picasso
查看>>
top命令
查看>>
javascript的作用域
查看>>
新形势下初创B2B行业网站如何经营
查看>>
初心大陆-----python宝典 第五章之列表
查看>>
sysbench使用笔记
查看>>
有关电子商务信息的介绍
查看>>
NFC·(近距离无线通讯技术)
查看>>
多线程基础(三)NSThread基础
查看>>
PHP的学习--Traits新特性
查看>>
ubuntu下,py2,py3共存,/usr/bin/python: No module named virtualenvwrapper错误解决方法
查看>>
Ext.form.field.Number numberfield
查看>>
Linux文件夹分析
查看>>
解决部分月份绩效无法显示的问题:timestamp\union al\autocommit等的用法
查看>>
nginx 域名跳转 Nginx跳转自动到带www域名规则配置、nginx多域名向主域名跳转
查看>>
man openstack >>1.txt
查看>>
linux几大服务器版本大比拼
查看>>
在BT5系统中安装postgresQL
查看>>
【Magedu】Week01
查看>>