jQuery源代码学习笔记_工具函数_noop/error/now/trim

jquery提供了一系列的工具函数,用于支持其运行,今天主要分析noop/error/now/trim这4个函数:

1.noop

//返回一个空函数
function noop() {
}

noop这个函数的功能就是什么也不做,方便在全局使用一个空函数,减少内存开销。


2.error

function error(msg) {
throw new Error(msg);
}

用于统一抛出异常,可以减少代码中使用throw/new,降低使用要求。

JS的异常处理

TODO


3.now

function now() {
return +(new Date());
}

用于返回当前的时间戳。注意返回结果使用"+"转换成数字(Number)

JS基础类型的优雅类型转换

在JS中基本的值类型Boolean、Number和String可以通过调用其构造函数的方式来进行相互转换。eg: var num = Number(str);但是这样的写法无疑不够优雅,对于这三者之间的类型转换,我们可以如下处理。

Boolean、String和Date转换成数字:

不能使用parseInt 和parseFloat两个函数来进行转换,这两个函数会转换字符串开头的有效数字。优雅的写法应当是使用"+"号,同时在数学运算中"-"、"*"、"/"和"%"都可以用于进行数字转换,如果原对象不能转换成数字,返回NaN。

Number和Boolean转换成String:

优雅的写法应当是写成'' + 变量。

Number和String转换成Boolean:

优雅的写法是!!变量,如果本来就取反义,那就写一个!。

前几日在看fex-team的源代码,函数里面用到的类型转换写法不太优雅,下面是其中截取的代码片段:

分析:

  1. count>=max(红色框)用到两次,是不是应该变量缓存
  2. 最后一句return(红色下划线)有点复杂化了,因为count>=max的结果就是boolean类型,而采用三元运算符方法和count>=max的结果是相反的,那么直接可以用!(非)即可。

针对上面延伸理解JS优雅的类型转换规则第3点:我觉得比较优雅的写法应该是:

var a = count >= max;
if (a && flag) {
flag = false;
this.trigger('error', 'Q_EXCEED_NUM_LIMIT', max, file);
setTimeout(function () {
flag = true;
},
1);
} return !a;
});

再看文中的下面一段代码,相比之前已经很好了(蓝色框是相对上面改善的改变体现)



至少这里已经把变量缓存了,同样道理,我觉得比较优雅的写法应该是:!invalid代替原来的三元运算符

uploader.on('beforeFileQueued', function (file) {
var invalid = count + file.size > max; if (invalid && flag) {
flag = false;
this.trigger('error', 'Q_EXCEED_SIZE_LIMIT', max, file);
setTimeout(function () {
flag = true;
},
1);
} return !invalid;
});

4.trim

var rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g; //正则表达式要理解,BOM就是字节FEFF。
function trim(text) {
return text == null ? "" : (text + "").replace(rtrim, "");
}

用于去除字符串两边的空白字符和BOM

UTF-8 BOM是什么?

我们看到百度百科里面关于BOM的介绍如下:

如果您在修改任何PHP文件後发生:

  • 不能登入或者不能登出;
  • 页顶出现一条空白;
  • 页顶出现错误警告;
  • 其它不正常的情况。

则多半是编辑器的问题,本程序采用UTF-8编码。现在几乎所有的文本编辑软件都可以显示并编辑UTF-8编码的文件。类似WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM,转换成Unicode为FEFF)。它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。对于一般的文件,这样并不会产生什么麻烦。但对于 PHP来说,BOM是个大麻烦。

PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个字符呢!

总结起来就是:linux的UTF-8是没有前缀的,而Windows默认使用ASCII码,所以UTF-8文件前面会有一个前缀FEFF,三个字节来标注自己是UTF-8文件,而浏览器大多不会对Windows特殊优化,所以会认为这三个字节是有效内容,浏览器很多时候会使用GBK或者Unicode这样的双字节编码,在前面加上奇数个字节会造成全文不可读,所以很多时候,我们要求网页不能有BOM。

一言以蔽之:BOM只有Windows系统认识,浏览器不认识。

jQuery源代码学习笔记_工具函数_noop/error/now/trim的更多相关文章

  1. jQuery源代码学习笔记_01

    如何获取jQuery源代码 1.可以从GitHub上下载到没有合并和压缩的源代码 2.如果要查看兼容IE6-8的版本,请选择1.x-master分支 3.可以使用git clone也可以使用downl ...

  2. jQuery源代码学习笔记:jQuery.fn.init(selector,context,rootjQuery)代码具体解释

    3.1 源代码 init: function( selector, context, rootjQuery ) { var match, elem, ret, doc; // Handle $(&qu ...

  3. jQuery源代码学习笔记:构造jQuery对象

    2.1源代码结构: (function( window, undefined ) { var jQuery = (function() { // 构建jQuery对象 var jQuery = fun ...

  4. jQuery源代码学习笔记_bind

    一般想到JS的兼容性问题的时候,首先会想到addEventListener与attachEvent这一对冤家,那么我们先来看看它们有什么兼容性问题 addEventListener与attachEve ...

  5. jQuery源代码学习_工具函数_type

    jquery源代码学习_工具函数_type jquery里面有一个很重要的工具函数,$.type函数用来判断类型,今天写这篇文章,是来回顾type函数的设计思想,深入理解. 首先来看一下最终结果: 上 ...

  6. OpenCV 学习笔记03 findContours函数

    opencv-python   4.0.1 1 函数释义 词义:发现轮廓! 从二进制图像中查找轮廓(Finds contours in a binary image):轮廓是形状分析和物体检测和识别的 ...

  7. canvas学习笔记、小函数整理

    http://bbs.csdn.net/topics/391493648 canvas实例分享 2016-3-16 http://bbs.csdn.net/topics/390582151 html5 ...

  8. [Java] LinkedList / Queue - 源代码学习笔记

    简单地画了下 LinkedList 的继承关系,如下图.只是画了关注的部分,并不是完整的关系图.本博文涉及的是 Queue, Deque, LinkedList 的源代码阅读笔记.关于 List 接口 ...

  9. IOS学习笔记07---C语言函数-printf函数

    IOS学习笔记07---C语言函数-printf函数 0 7.C语言5-printf函数 ------------------------- ----------------------------- ...

随机推荐

  1. spring aop实现权限管理

    问题源于项目开发 最近项目中需要做一个权限管理模块,按照之前同事的做法是在controller层的每个接口调用之前上做逻辑判断,这样做也没有不妥,但是代码重复率太高,而且是体力劳动,so,便有了如题所 ...

  2. 「BZOJ 3270」博物馆「高斯消元」

    应该算高斯消元经典题了吧. 题意:一个无向连通图,有两个人分别在\(s,t\),若一个人在\(u\),每一分钟有\(p[u]\)的概率不动,否则随机前往一个相邻的结点,求在每个点相遇的概率 题解: 首 ...

  3. [Django笔记] 从已有的数据库构建应用

    Django适合从零开始构建,所谓 'Green-field' 开发.那么当我需要基于已存在的数据库构建应用时怎么办呢? inspectdb # 扫描默认数据库 python manage.py in ...

  4. J2SE-鸡汤

    前言 终于开始学java了,心里免不了的开心,总是听老乡说他们公司搞java开发,用的什么什么框架,说的自己都有点眼馋了,但是根据自己的性格,不了解它,肯定不会就去用它的.所以在学习框架之前,java ...

  5. springdataRedis连接redis集群

    配置文件: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http:// ...

  6. 使用windows服务修改CPU型号(重启依然有效)

    此项目基于.net framework 4.0 效果如下: 服务运行前: 服务运行后: 思路大概是这样: 通过修改注册表可以修改CPU型号,把服务设置成本地服务,并且开机自动启动,来实现开机自动修改处 ...

  7. [Groovy]Groovy with Ant Task

    平时经常会用Ant来写一写脚本,但最近跨入到Groovy的时代,试着做一些改变.Groovy里集成了AntBuilder能非常方便的调用到Ant的对象模型. 现考察如下 1. Groovy里定义的属性 ...

  8. Codeforces - 151C 质因子分解

    显然只需要能跑到第二个因子就赢了 需要特判非平凡因子 常数优化:不用求出所有因子,跑完第二个素数就行了 #include<bits/stdc++.h> using namespace st ...

  9. CMOS和BIOS

      CMOS是一类特殊的RAM(断电时将丢失其存储内容) BIOS是软件,是程序! CMOS是芯片,是硬件! 实际上我们是通过BIOS这个程序,去设置COMS的参数的.. COMS是一块芯片,继承在主 ...

  10. CF 520 B. Two Buttons(bfs)

    /*题意:一个数,就是输入的第一个数,让它变成第二个数最少用几步.可以点红色按钮,蓝色按钮来改变数字,红色:*2,蓝色:-1,如果变成负数,就变成原来的数.CF 520 B. Two Buttons思 ...