jQuery源码学习笔记(1)

前端培训那会儿,老师一直都强调一定要学习一门框架的源码,基于JavaScript的前端框架很多,工作中接触的各类框架,从来没有细心研究过。直到有一天,突然觉得自己只会用根本不知道这个框架的内部实现原则,我选择了工作多年用到最多的jQuery做研究,汇总了学习的笔记。

本系列文章基于jQuery1.11.1.js。后续会不断更新,争取每天一篇。

第一篇

1、$.type();判断数据类型。

用法:$.type({});//"object"

源码解读:

class2type = {};

jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name){

class2type["[object"+ name +"]"] = name.toLowerCase();

//对象class2type的键"[object"+ name +"]",值name.toLowerCase()。

/* class2type输出结果为:

* class2type = ["[object Boolean]":"boolean", "[object Number]": "number", "[object String]": "string", "[object Function]": "function", "[object Array]": "array", "[object Date]": "date", "[object RegExp]": "regexp", "[object Error]": "error"];

*/

});

core_toString = class2type.toString;

/* 将class2type所具备的toString方法赋值给变量core_toString

*  core_toString 对象实例的toString,每一个继承自Object的对象都有toString方法

*  {}.toString.call([]); //"[object Array]" ,改变toString的this指向为object实例。

*/

// 主方法

type: function(obj){

if(obj == null){

return String(obj);

}

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

}

2、$.trim() 去除字符串首尾空格。

用法:$.trim(str); //返回去除首尾空格的字符串

源码解读:

rtrim = /^[\d\uFEFF\xA0]+|[\d\uFEFF\xA0]+$/g;

/* 正则匹配:

*  \d空格,\uFEFF非UTF-8编码的空格,\xA0指 

*/

core_version = '1.11.1';

core_trim = core_version.trim; //trim原生对字符串进行的首尾巴去除空格方法

trim: core_trim && !core_trim.call("\uFEFF\xA0") ?

function(text){

return text = null ? "": core_trim.call(text);

} :

function(text) {

return text == null ? "": (text + "").replace(rtrim, "");

}

/*

* 尝试使用原生的trim方法,如果不支持使用String.prototype.trim.call("\uFEFF\xA0"),最后使用正则replace

*/

3、Query.each(); 遍历数据或对象。

内部实现使有for循环,效率要比使用for差,对于大型循环,尽量使用for。

4、$.isNumeric() 判断是否是数字。

用法:$.isNumeric(num);

源码解读:

isNumeric: function(obj){

return !isNaN(parseFloat(obj)) && isFinite(obj);

/* isNaN判断是不是数字,true不是数字,false是数字

*  parseFloat 字符串转数字,数字进制转换

*  isFinit(obj) 判断是不是有穷大。

* !a && b 计算顺序:  (!a) && b

*/

}

5、$.isEmptyObject() 判断对象是否为空。

用法:$.isEmptyObject(obj);

源码解读:

isEmptyObject: function(obj){

var name;

for(name in obj){

return false; //非空

}

return true; //空

}

6、$.parseJSON() 将JSON字符串转换成JSON对象。

// JSON正则

rvalidchars = /^[\],:{}\s]*$/,

rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,

rvalidescape = /\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,

rvalidtokens = /"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g

parseJSON: function(data){

//如果有原生的JSON对象支持,使用原生对象

if(window.JSON && window.JSON.parse){

return window.JSON.parse(data);

}

if(data === null){

return data;

}

if(typeof data === "string"){

//去掉两端空格,制表符,bom

data = jQuery.trim(data);

if(data){

//保证输入的字符串是可用的JSON字符串

if(rvalidchars.test(data.replace(rvalidescape, "@")

.replace(rvalidtokens, "]")

.replace(rvalidtokens, "")

)){

console.log(data);

return (new Function("return " + data))(); //字符串转JSON对象,使用return(new Function("return " + data))();

}

}

}

jQuery.error("Invalid JSON:" + data);

}

7、$.globalEval();在全局作用域执行下一段JS脚本。

//在全局作用域中执行JS脚本

globalEval: function(data){

if(data && jQuery.trim(data)) {

//匿名函数作用域是window 在IE中使用execScript

(window.execScript || function(data){

window["eval"].call(window, data); //eval作用域问题,IE和其他浏览器下执行结果不同。

})(data);

}

}

eval作用域:

var a = "window";

function b(){

eval('val a = "b"');

}

b();

alert(a); //“window”

window.eval和eval作用域不同。

var a = "window";

function b(){

window.eval('var a = "b"');

}

b();

alert(a); //IE下是"window",Chorme,FF下是"b"


目录  下一篇:暂无

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,108评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,699评论 1 296
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,812评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,236评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,583评论 3 288
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,739评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,957评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,704评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,447评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,643评论 2 249
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,133评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,486评论 3 256
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,151评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,108评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,889评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,782评论 2 277
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,681评论 2 272

推荐阅读更多精彩内容

  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 3,152评论 0 4
  • JS基础讲解 JavaScript组成ECMAScript:解释器、翻译DOM:Document Object M...
    FConfidence阅读 546评论 0 1
  • 晚唐李商隐 盛唐李白,孟浩然,杜甫(诗圣),王维,白居易 初唐四杰王勃 文看秦汉 流派:山水田园,边塞 唐玄宗,杨贵妃
    宝莲灯Joey阅读 114评论 0 0
  • 经同事独家授权,原创发表此文 作者说明:**苗立尧 **易宝支付运维工程师,热爱Kubernetes,对容器生态圈...
    小程故事多阅读 4,840评论 0 11
  • 冒着雨奔赴机场,不怕,就一些小雨点而已,就当它是伴我归故里的小伙伴。 喜欢雨滴落的感觉,它可拭淡生活的纷扰,亦可涤...
    孝蒽阅读 302评论 0 1