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的源代码,函数里面用到的类型转换写法不太优雅,下面是其中截取的代码片段:
分析:
- count>=max(红色框)用到两次,是不是应该变量缓存
- 最后一句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系统认识,浏览器不认识。