从jquery源码中看类型判断和数组的一些操作
在深入看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源码中看类型判断和数组的一些操作的更多相关文章
- js便签笔记(9)——解读jquery源码时记录的一些知识点
近来一直利用业余时间在看jquery2.1.1源码,大约看了两千行了.平时看的时候,做了一些笔记,贴出来分享. 1. Array.prototype.slice.call 可以将伪数组转化为真正的数组 ...
- jQuery源码笔记(一):jQuery的整体结构
jQuery 是一个非常优秀的 JS 库,与 Prototype,YUI,Mootools 等众多的 Js 类库相比,它剑走偏锋,从 web 开发的实用角度出发,抛除了其它 Lib 中一些中看但不实用 ...
- JQuery源码解析(一)
写在前面:本<JQuery源码解析>系列是基于一些前辈们的文章进行进一步的分析.细化.修改而写出来的,在这边感谢那些慷慨提供科普文档的技术大拿们. 要查阅JQ的源文件请下载开发版的JQ.j ...
- jquery 源码解析
静态与实力方法共享设计 遍历方法 $(".a").each() //作为实例方法存在 $.each() //作为静态方法存在 Jquery源码 jQuery.prototype = ...
- jQuery 源码解析二:jQuery.fn.extend=jQuery.extend 方法探究
终于动笔开始 jQuery 源码解析第二篇,写文章还真是有难度,要把自已懂的表述清楚,要让别人听懂真的不是一见易事. 在 jQuery 源码解析一:jQuery 类库整体架构设计解析 一文,大致描述了 ...
- Jquery源码分析与简单模拟实现
前言 最近学习了一下jQuery源码,顺便总结一下,版本:v2.0.3 主要是通过简单模拟实现jQuery的封装/调用.选择器.类级别扩展等.加深对js/Jquery的理解. 正文 先来说问题: 1. ...
- jquery源码 Callback
工具方法.对函数的统一管理. jquery2.0.3版本$.Callback()部分的源码如下: // String to Object options format cache var option ...
- js菜鸟进阶-jQuery源码分析(1)-基本架构
导读: 本人JS菜鸟一枚,为加强代码美观和编程思想.所以来研究下jQuery,有需要进阶JS的同学很适合阅读此文!我是边看代码(jquery2.2.1),边翻“javascript高级程序设计”写的, ...
- jQuery源码分析学习--资料收集--更新中
1.逐行分析jQuery源码的奥秘 - 网易云课堂 http://study.163.com/course/courseMain.htm?courseId=465001#/courseDetail? ...
随机推荐
- OGRE的学习资源
本文介绍从哪儿开始学习OGRE(Object-Oriented Graphics Rendering Engine的简称,又叫做OGRE 3D),如何在网上找寻OGRE的学习资源. 首先是wikipe ...
- 系统中异常公共处理模块 in spring boot
最近在用spring boot 做微服务,所以对于异常信息的 [友好展示]有要求,我设计了两点: 一. 在业务逻辑代码中,异常的抛出 我做了限定,一般只会是三种: 1. OmcException // ...
- String、Stringbuffer、StringBuilder的区别(转载)
最近学习到StringBuffer,心中有好些疑问,搜索了一些关于String,StringBuffer,StringBuilder的东西,现在整理一下. 关于这三个类在字符串处理中的位置不言而喻,那 ...
- Arrays.asList()注意
api: public static <T> List<T> asList(T... a) 返回一个受指定数组支持的固定大小的列表.(对返回列表的更改会“直接写”到数组.)此方 ...
- PHPMyAdmin弱口令猜解【Python脚本】
PHPMyAdmin弱口令猜解 测试截图: 代码片段 #! /usr/bin/env python # _*_ coding:utf-8 _*_ import requests import time ...
- 《C与指针》第十五章练习
本章例程 15.1打开和关闭文件 #include <stdlib.h> #include <stdio.h> int main(int ac, char **av) { in ...
- php获取post参数的几种方式 RPC 规定接收取值方式 $GLOBALS['HTTP_RAW_POST_DATA'];
http://www.cnblogs.com/zhepama/p/4022606.html PHP默认识别的数据类型是application/x-www.form-urlencoded标准的数据类型. ...
- UML基础与Rose建模实训教程
目 录 第1章 初识UML. 1 1.1 初识UML用例图... 1 1.2 初识UML类图... 3 第2章 Rational Rose工具... 6 2.1 安装与配置Rational Ro ...
- ASP.NET的MVC项目BUG——“所需的防伪表单字段‘__RequestVerificationToken’不存在”
问题:所需的防伪表单字段‘__RequestVerificationToken’不存在 解决办法: [ValidateAntiForgeryToken]能在[HttpPost]下用 [Validate ...
- 【Yii2-CookBook】JSON 和 XML 输出
Web 和移动应用程序现在不仅仅只是用来呈现 HTML. 现在开发一个移动客户端,利用服务器 api 驱动前端,所有的用户交互都在客户端哪里.JSON 和 XML 格式通常用于序列化和传输结构化数据通 ...