在深入看jquery源码中,大家会发现源码写的相当巧妙。那我今天也通过几个源码中用到的技巧来抛砖引玉,希望大家能共同研究源码之精华,不要囫囵吞枣。

1.将类数组转化成数组

我想大家首先想到的方法是for in循环,这是很对的,也是行之有效的。但是并非是效果最优的。因为需要循环,然后把循环出来的值push进新数组里,估计怎么也得10行代码吧。。。

那么jquery中是怎么用的呢? Array原型上的slice方法。

我们在控制台中打上Array.prototype.slice 那么会出来一个完整的slice方法。同样,如果打上Array.prototype.push ,也会出来一个完整的push方法。那么我们可以认定,数组的这些方法都是定义在Array 的prototype上的。

现在定义一个类数组。至于什么是类数组,我在这里就不赘述了,忘了的同学可以查查资料。

var obj={0:'zhangsan',1:24,2:'male',length:3};

ok,大家知道,类数组有lengh属性,与数组类似,但是两者的最大区别就是:类数组无法使用数组上的方法。那么怎么办呢?这时主角要出场了,热烈欢迎!!

Array.prototype.slice.call()

看一下完整的解决方法,然后再分析:

var obj={0:'zhangsan',1:24,2:'male',length:3};

var res = Array.prototype.slice.call(obj);

console.log(res); //["zhangsan", 24, "male"]

就这么简单的一行,结果就出现了,是不是比循环的十几行要优化多了?

好了,现在详细方希Array.prototype.slice.call()

首先看call方法,大家可能都知道,call是会让调用它的方法里的this关键字指向发生变化

function tests(){
alert(this);
}
tests.call('test'); // test

好,那么通过上面这个例子,我们可以知道Array.prototype.slice.call() 改变的是数组原型的slice方法中的this值。

纠结的事情来了,这个this在哪啊?明明没有看到this啊。 这就对应了一句话:所见并非即所得。

虽然我们在这句话中没有见到this,但是可以想象在js源码的slice方法中一定有this。

既然slice里的this关键字改成obj了,那么obj可以用slice方法了。

现在再解释一下slice方法,是从一个起始点到终点,如slice(0)就代表从第0项到最后。

那么完整解释一下这句话: Array.prototype.slice.call(obj) 就是把obj从第0项到最后一项的值存到一个新数组中,如何判断哪个是最后一项?length属性,看length等于3,那么最后一项就是索引为2的那一项。

现在再看obj

var obj={0:'zhangsan',1:24,2:'male',length:3};

很明显,第0项就是zhangsan,第1项是24,第2项是male,第2项是最后一项。

所以结果是:["zhangsan", 24, "male"]

希望我的分析能给大家一点点别样的灵感。下面的分析就不这么细了

2.将一个数组合并到另一个数组: Array.prototype.push.apply(arr1,arr2)

var arr1 = [1,2,3];
var arr2 = [4,5,6];
arr1.push(arr2) //[1,2,3,[4,5,6]]

这显然不是我们想要的,

var arr1 = [1,2,3];
var arr2 = [4,5,6];
Array.prototype.push.apply(arr1,arr2);
console.log(arr1) //[1,2,3,4,5,6]

这样就能完美的解决。但这个方法不是万能的,当要插入的数组数值很大时就会出现错误。所以我们用时要注意。

3.判断变量的详细类型

Object.prototype.toString.call(obj)

用这个方法可以详细的判断出类型到底是object 还是array还是date 等,而原生的typeof  instanceof 都有缺点,无法正确判断。

时间关系,先写这些

从jquery源码中看类型判断和数组的一些操作的更多相关文章

  1. js便签笔记(9)——解读jquery源码时记录的一些知识点

    近来一直利用业余时间在看jquery2.1.1源码,大约看了两千行了.平时看的时候,做了一些笔记,贴出来分享. 1. Array.prototype.slice.call 可以将伪数组转化为真正的数组 ...

  2. jQuery源码笔记(一):jQuery的整体结构

    jQuery 是一个非常优秀的 JS 库,与 Prototype,YUI,Mootools 等众多的 Js 类库相比,它剑走偏锋,从 web 开发的实用角度出发,抛除了其它 Lib 中一些中看但不实用 ...

  3. JQuery源码解析(一)

    写在前面:本<JQuery源码解析>系列是基于一些前辈们的文章进行进一步的分析.细化.修改而写出来的,在这边感谢那些慷慨提供科普文档的技术大拿们. 要查阅JQ的源文件请下载开发版的JQ.j ...

  4. jquery 源码解析

    静态与实力方法共享设计 遍历方法 $(".a").each() //作为实例方法存在 $.each() //作为静态方法存在 Jquery源码 jQuery.prototype = ...

  5. jQuery 源码解析二:jQuery.fn.extend=jQuery.extend 方法探究

    终于动笔开始 jQuery 源码解析第二篇,写文章还真是有难度,要把自已懂的表述清楚,要让别人听懂真的不是一见易事. 在 jQuery 源码解析一:jQuery 类库整体架构设计解析 一文,大致描述了 ...

  6. Jquery源码分析与简单模拟实现

    前言 最近学习了一下jQuery源码,顺便总结一下,版本:v2.0.3 主要是通过简单模拟实现jQuery的封装/调用.选择器.类级别扩展等.加深对js/Jquery的理解. 正文 先来说问题: 1. ...

  7. jquery源码 Callback

    工具方法.对函数的统一管理. jquery2.0.3版本$.Callback()部分的源码如下: // String to Object options format cache var option ...

  8. js菜鸟进阶-jQuery源码分析(1)-基本架构

    导读: 本人JS菜鸟一枚,为加强代码美观和编程思想.所以来研究下jQuery,有需要进阶JS的同学很适合阅读此文!我是边看代码(jquery2.2.1),边翻“javascript高级程序设计”写的, ...

  9. jQuery源码分析学习--资料收集--更新中

    1.逐行分析jQuery源码的奥秘 - 网易云课堂  http://study.163.com/course/courseMain.htm?courseId=465001#/courseDetail? ...

随机推荐

  1. Latex 数学符号

    本文完全转自 <常用数学符号的 LaTeX 表示方法>,在此转载仅仅为了便于查阅,谨向原作者致以崇高的敬意. 常用数学符号的 LaTeX 表示方法 (以下内容主要摘自“一份不太简短的 LA ...

  2. iOS截屏

    - (UIImage *)captureImageFromView:(UIView *)view{ UIGraphicsBeginImageContext(view.bounds.size); CGC ...

  3. Java笔记10-Object包装类型字符串

    提纲: 1.java.lang.0bject中常用方法介绍 2.基本类型对应的包装类型的介绍 以及基本类型和包装类型之间的相互转换 3.java.lang.String 字符串处理类 java.lan ...

  4. 实现TCP、UDP相互通信及应用

    实验名称  Socket编程综合实验(1) 一.实验目的: 1.理解进程通信的原理及通信过程 2.掌握基于TCP和UDP的工作原理 3.掌握基本的Socket网络编程原理及方法 二.实验内容 1.掌握 ...

  5. 通过BroadCast与service时时监听网络变化

    首先需要一个service: 这里我定义了一个NetworkStateService,在这个service中我写了一个BroadcastReceiver用于监听网络状态发生改变的情况并在这个servi ...

  6. NOIP2014提高组解方程

    其实没有太难 但是不知道的话想不到 考场上大概有50分吧 #include <iostream> #include <stdio.h> #include <queue&g ...

  7. 《Android深度探索HAL与驱动开发》第二章阅读心得

    按照书中所讲的步骤,第一步先准备好搭建Android开发环境所需要的工具:JDK6或以上版本:Eclipse3.4或以上版本:ADT:CDT:Android SDK:Android NDK;交叉编译环 ...

  8. oracle rman恢复数据库 方式恢复到异地数据库

    目的:从某个环境中,获取相关文件,放到异地机器使用rman 恢复.   情况说明:XX系统使用的是oracle数据库,现已从服务器拉下来相关文件,依靠这些文件来早本地的测试机上恢复数据库,方便进行数据 ...

  9. MIPS指令集相关

    寄存器: 寄存器号            符号名            用途 0                 始终为0     看起来象浪费,其实很有用 1                 at  ...

  10. MVC授权

    public class CommonController : Controller { protected override void OnAuthorization(AuthorizationCo ...