CoffeeScript
2023-03-12
21
筛选数组
问题
你想要根据布尔条件来筛选数组。
解决方案
使用Array.filter (ECMAScript 5): array = [1..10]
array.filter (x) -> x > 5
# => [6,7,8,9,10]在EC5之前的实现中,可以通过添加一个筛选函数扩展Array的原型,该函数接受一个回调并对自身进行过滤,将回调函数返回true的元素收集起来。# 扩展 Array 的原型
Array::filter = (callback) ->element f
2023-03-12
32
比较范围
问题
如果你想知道某个变量是否在给定的范围内。
解决方案
使用CoffeeScript的连缀比较语法。maxDwarfism = 147
minAcromegaly = 213height = 180normalHeight = maxDwarfism < height < minAcromegaly
# => true
讨论
这是从Python中借鉴过来的一个很棒的特性。利用这个特性,不必像下面这样写出完整的比较:normalHeight = height > maxD
2023-03-12
32
检测与构建丢失的函数
问题
你想要检测一个函数是否存在,如果不存在则构建该函数。(比如Internet Explorer 8的ECMAScript 5函数)。
解决方案
使用存在赋值运算符(?=)来把函数分配给类库的原型(使用::简写),然后把它放于一个立即执行函数表达式中(do ->)使其含有所有变量。do -> Array::filter ?= (callback) ->element for element in this when callback elementarray =
2023-03-12
29
把字符串转换为大写形式
问题
你想把字符串转换成大写形式。
解决方案
使用JavaScript的String的toUpperCase()方法:"one two three".toUpperCase()
# => 'ONE TWO THREE'
讨论
toUpperCase()是一个标准的JavaScript方法。不要忘了带圆括号。
语法块
通过下面的快捷方式可以添加某种类似Ruby的语法块:String::upcase = -> @toUpperCase()
2023-03-12
29
计算两个日期中间的天数
问题
你需要找出两个日期间隔了几年,几个月,几天,几个小时,几分钟,几秒。
解决方案
利用JavaScript的日期计算函数getTime()。它提供了从1970年1月1日开始经过了多少毫秒。DAY = 1000 * 60 * 60 * 24d1 = new Date('02/01/2011')
d2 = new Date('02/06/2011')days_passed = Math.round((d2.getTime() - d1.getTim
2023-03-12
30
策略模式
问题
解决问题的方式有多种,但是你需要在程序运行时选择(或是转换)这些方法。
解决方案
在策略对象(Strategy objects)中封装你的算法。
例如,给定一个未排序的列表,我们可以在不同情况下改变排序算法。
基类StringSorter = (algorithm) ->sort: (list) -> algorithm list
策略bubbleSort = (list) ->anySwaps = falseswapPass = ->for r in [0..li
2023-03-12
28
双向服务器
问题
你想通过网络提供持续的服务,与客户保持持续的联系。
解决方案
创建一个双向TCP服务器。
在 Node.js 中net = require 'net'domain = 'localhost'
port = 9001server = net.createServer (socket) ->console.log "New connection from #{socket.remoteAddress}"socket.on 'd
2023-03-12
25
当函数括号不可选
问题
你想要调用一个没有参数的函数,但不希望使用括号。
解决方案
不管怎样都使用括号。
另一个方法是使用do表示法,如下:notify = -> alert "Hello, user!"
do notify if condition
编译成JavaScript则可表示为:var notify;
notify = function() {return alert("Hello, user!");
};
if (condition) {notif