CoffeeScript
2023-03-12
30
去抖动函数
问题
你想只执行某个函数一次,在开始或结束时把多个连续的调用合并成一个简单的操作。
解决方案
使用一个命名函数:debounce: (func, threshold, execAsap) ->timeout = null(args...) ->obj = thisdelayed = ->func.apply(obj, args) unless execAsaptimeout = nullif timeoutclearTimeout(timeout)else if (execA
2023-03-12
31
生成可预测的随机数
问题
你需要生成在一定范围内的随机数,但你也需要对发生器进行“生成种子”操作来提供可预测的值。
解决方案
编写你自己的随机数生成器。当然有很多方法可以做到这一点,这里给出一个简单的示例。 该发生器绝对不可以以加密为目的!class Rand# 如果没有种子创建,使用当前时间作为种子constructor: (@seed) -># Knuth and Lewis' improvements to Park and Miller's LCPRNG@multiplier
2023-03-12
73
指数对数运算
问题
你需要进行包含指数和对数的运算。
解决方案
使用JavaScript的Math对象来提供常用的数学函数。# Math.pow(x, y) 返回 x^y
Math.pow(2, 4)
# => 16# Math.exp(x) 返回 E^x ,被简写为 Math.pow(Math.E, x)
Math.exp(2)
# => 7.38905609893065# Math.log returns the natural (base E) log
Math.log(5)
# =&g
2023-03-12
48
使用 Jasmine 测试
问题
假如你正在使用CoffeeScript写一个简单地计算器,并且想要验证其功能是否与预期一致。可以使用Jasmine测试框架。
讨论
在使用Jasmine测试框架时,你要在一个参数(spec)文档中写测试,文档描述的是代码需要测试的预期功能。
例如,我们希望计算器可以实现加法和减法的功能,并且可以正确进行正数和负数的运算。我们的spec文档如下列所示。# calculatorSpec.coffee
describe 'Calculator', ->it
2023-03-12
40
将数组连接
问题
你希望将两个数组连接到一起。
解决方案
在JavaScript中,有两个标准方法可以用来连接数组。
第一种是使用JavaScript的数组方法concat():array1 = [1, 2, 3]
array2 = [4, 5, 6]
array3 = array1.concat array2
# => [1, 2, 3, 4, 5, 6]
需要指出的是array1没有被运算修改。连接后形成的新数组的返回值是一个新的对象。
如果你希望在连接两个数组后不产生新的对象,那么你可以使用下
2023-03-12
22
生成随机数
问题
你需要生成在一定范围内的随机数。
解决方案
使用JavaScript的Math.random()来获得浮点数,满足0<=X<1.0。使用乘法和Math.floor得到在一定范围内的数字。probability = Math.random()
0.0 <= probability < 1.0
# => true# 注意百分位数不会达到 100。从 0 到 100 的范围实际上是 101 的跨度。
percentile = Math.floor(Math.ran
2023-03-12
47
服务端和客户端的代码重用
问题
当你在CoffeeScript上创建了一个函数,并希望将它用在有网页浏览器的客户端和有Node.js的服务端时。
解决方案
以下列方法输出函数:# simpleMath.coffee# these methods are private
add = (a, b) ->a + bsubtract = (a, b) ->a - bsquare = (x) ->x * x# create a namespace to export our public meth
2023-03-12
29
SQLite
问题
你需要Node.js内部与SQLite数据库连接的接口。
解决方案
使用SQLite 模块。sqlite = require 'sqlite'db = new sqlite.Database# The module uses asynchronous methods,
# so we chain the calls the db.execute
exampleCreate = ->db.execute "CREATE TABLE snacks (name