这段时间在作什么呢,第一是在折腾 CoffeeScript ,第二是在看 Underscore.js ,第三是买了两本书《JavaScript 修炼之道》和《JavaScript 高级程序设计》。
我果然是个挖坑不填的家伙啊,《程序员修炼之道》还没看完呢……
关于 《JavaScript 修炼之道》
《JavaScript 修炼之道》是一本很薄的书,由于《JavaScript 语言精粹》还没到,所以我不好对比两者的厚薄程度,不过想来两者都是差不多的。
《JavaScript 修炼之道》算是一本比较浅显的入门提高书,说是入门提高,在我看来其实应该就是入门书。
唯一作了笔记的部分是:
可以利用 JavaScript 的方括号操作符我们可以做到动态的调用方法及熟悉,比如
由于传入的是一个字符串,所以几乎所有结果能够获得字符串的代码都能在方括号里使用,比如:
window[isHistory?'history':'other']
window[(enable?'add':'delete')+'action']
window[{firstName:'foo',lastName:'bar'}[needFirst?'firstName':'lastName']]
值得注意的是,如果你在向方法传递的参数上大量使用这个技巧,将使代码变得难以阅读,此时使用常规的 if/else 结构更加明智
所以说,如果你已经到了对 JavaScript 有一些心得的时候,就不需要再看这本书了,看其他书应该更合适一些。
关于 CoffeeScript
CoffeeScript 是一门为了编译成 JavaScript 而诞生的语言,推荐者的说法是保留了 good part of javascript ,规避了不好的部分。
我不怎么苟同。
CoffeeScript 几乎摈弃了大部分的括号,用空格代替,但是在有些链式的写法中,倘若不使用括号就会使得编译成的 JavaScript 与原意大相径庭,一旦使用了括号以后,会让代码看起来突然就变得丑陋起来。
CoffeeScript 的语法糖是很多使用者上贼船的驱动力之一,不过个人觉得语法糖过多了点,比如 if not 和 unless ,我觉得完全没有出现 unless 的必要么……
什么?你问我还有什么不喜欢的?好吧,没有了。CoffeeScript 我很喜欢。
我最近在用 CoffeeScript 重写 Underscore.js ,虽然可以用 js2coffee 这个工具,但在我看来还是比不上经过大脑加工以后的 CoffeeScript。嗯,既看源码又玩玩 CoffeeScript,确实是件愉悦的事情。
关于 Underscore.js
关于 Underscore.js ,唯一不满的地方是直接改原型不就好了么……竟然还要弄个 _ 对象出来……
我的进度不快,目前只写完了 // Collection Functions 一块,觉得有趣的部分是两句代码:
computed >= result.computed && (result = {value : value, computed : computed});
if (result || (result = iterator.call(context, value, index, list))) return breaker;
如果&&的第一个运算数是false,就不再考虑第二个运算数,直接返回false;如果||的第一个运算数是true,也不再考虑第二个运算数,直接返回true。
因此,这两个运算符也可以使用在简化选择性执行语句的操作中(据我所知,这个在其他语言中(Python/C#)也是如此,然而我在阅读其他语言的源码时却鲜有遇见这样的代码,不知为何)。上面的两句代码可以翻译成下面的代码:
if (computed >= result.computed) {
result = {value : value, computed : computed};
}
if (!result) {
result = iterator.call(context, value, index, list);
}
if (result) {
return breaker;
}
有兴趣可以看一下这篇文章 《JS的&&和&,||和|运算符两个不同点》
以及一些其他的
查 Infinity 时查到的, 《奇怪的js NaN and Infinity》
//Parsing something that isn't a number results in NaN. isNaN helps to detect those cases:
parseInt("hello", 10) // NaN
isNaN(parseInt("hello", 10)) // true
//Division through zero results in Infinity:
1 / 0 // Infinity
//Both NaN and Infinity are of type "number":
typeof NaN // "number"
typeof Infinity // "number"
//Note that NaN compares in a strange way:
NaN == NaN // false (!)
//But:
Infinity == Infinity // true