对jQuery.isArray方法的分析

jQuery.isArray方法应于判断是不是数组,是的话返回true,否则返回false。调用如:jQuery.isArray([]),返回true。其实现源码如下:

isArray: Array.isArray || function( obj ) {
    return jQuery.type(obj) === "array";
}

我们看到它的主要逻辑是先看浏览器支不支持Array.isArray方法,如果不支持则调应jQuery自己的jQuery.type方法,看其返回值是不是"array"。

firefox、chrome、IE9及以上的浏览器都支持Array.isArray方法。其它浏览器就需要jQuery.type的帮忙了,jQuery.type的源码如下:

type: function( obj ) {
    if ( obj == null ) {
        return obj + "";
    }
    return typeof obj === "object" || typeof obj === "function" ?
        class2type[ toString.call(obj) ] || "object" :
        typeof obj;
}

代码中的if好理解,如果传入的null则返回“null”字符串。

return 后面的代码结构上看起来比较乱。我们整理如下:

return ( typeof obj === "object" || typeof obj === "function" )  ? ( class2type[ toString.call(obj) ] || "object" ) : typeof obj;

现在清楚多了,它是判断( typeof obj === "object" || typeof obj === "function" )的值是不是真,如果是真则返回 ( class2type[ toString.call(obj) ] || "object" ),反之则返回 typeof obj。

所以当传入的是字符串,数字,undefined的时直接返回 typeof obj。当传入的是对象、数组、函数时则直接返回 ( class2type[ toString.call(obj) ] || "object" )。现在主要看看class2type[ toString.call(obj) ]的实现:

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

jQuery定义了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"
}

toString方法的返回值正好是class2type对象的key值。所以class2type[ toString.call(obj) ]正好得到我们需要的返回类型字符串。

时间: 2024-10-11 13:58:04

对jQuery.isArray方法的分析的相关文章

对jQuery.extend()方法的分析

jQuery.extend方法是我们常用的方法,也是jQuery源码中的基础方法.它的主要作用是:将一个或多个“源对象”合并到一个“目标对象”中,并返回目标对象.它主要有三种表现形式: a.jQuery.extend(destination, source1, source2, source3 ....) b.jQuery.extend( source ) c.jQuery.extend(boolean, destination, source1, source2, source3 ....)

jquery.map()方法的使用和源码分析

原型方法map跟each类似调用的是同名静态方法,只不过返回来的数据必须经过另一个原型方法pushStack方法处理之后才返回,源码如下: map: function( callback ) { return this.pushStack( jQuery.map(this, function( elem, i ) { return callback.call( elem, i, elem ); })); }, 本文主要就是分析静态map方法至于pushStack在下一篇随笔里面分析: 首先了解下

JQuery 支持 hide 和 show 事件的方法与分析

问题提出  JQuery不支持hide和show作为事件形式出现, 实际上这两个仅仅是JQuery对象的一个方法(fn): 有一类UI交互需求,根据一个DOM对象的或者显示对附属的DOM对象做相同操作, 一般情况下, 利用jquery hide和show方法的扩展参数中的回调函数,是可以实现的,例如: $( "#book" ).hide( "slow", function() { $( "#booklet" ).hide() }); 如果附属DO

Jquery getJSON方法分析

转自:http://www.cnblogs.com/jams742003/archive/2009/12/25/1632276.html 准备工作 ·Customer类 public class Customer { public int Unid { get; set; } public string CustomerName { get; set; } public string Memo { get; set; } public string Other { get; set; } } ·

Jquery getJSON方法分析(一)

准备工作 ·Customer类 public class Customer{    public int Unid { get; set; }    public string CustomerName { get; set; }    public string Memo { get; set; }    public string Other { get; set; }} ·服务端处理(Json_1.ashx) Customer customer = new Customer       {

jQuery.queue源码分析

作者:禅楼望月(http://www.cnblogs.com/yaoyinglong ) 队列是一种特殊的线性表,它的特殊之处在于他只允许在头部进行删除,在尾部进行插入.常用来表示先进先出的操作(FIFO)--先进队列的元素先出队.搜索整个jQuery库会发现,queue在jQuery内部仅供给animate动画来使用.它提供了对外的接口,因此程序员也可以使用队列来完成一些特殊需求. queue模块对外开放的API:工具方法:queue,dequeue,_queueHooks(仅内部使用)实例方

jQuery源码 框架分析

每一个框架都有一个核心,所有的结构都是基于这个核心之上,结构建立好了之后,剩下的就是功能的堆砌. jQuery的核心就是从HTML文档中匹配元素并对其操作. 就跟一座大楼一样,让我们一步一步了解这座大厦的基石和结构. 1.构造函数 2.链式语法 3.选择器 4.扩展性  一.构造函数 我们知道类是面向对象编程的一个重要概念,它是对事物的最高抽象,它是一个模型.通过实例化一个类,我们可以创建一个实例. javascript本身没有类的概念,只有原型prototype,prototype是什么呢?它

jQuery.attributes源码分析(attr/prop/val/class)

回顾 有了之前的几篇对于jQuery.attributes相关的研究,是时候分析jQuery.attr的源码了 Javascript中的attribute和property分析 attribute和property兼容性分析 jQuery.access源码分析 结构 jQuery.fn.extend({ attr: function (name, value) { }, removeAttr: function (name) { }, prop: function (name, value) {

jQuery extend方法使用及实现

一.jQuery extend方法介绍 jQuery的API手册中,extend方法挂载在jQuery和jQuery.fn两个不同对象上方法,但在jQuery内部代码实现的是相同的,只是功能却不太一样: 且看官方给出解释: jQuery.extend(): Merge the contents of two or more objects together into the first object.(把两个或者更多的对象合并到第一个当中): jQuery.fn.extend():Merge t