“Splats”在CoffeeScript教程中的含义是什么?

时间:2011-06-01 13:08:56

标签: javascript coffeescript

查看此CoffeeScript教程:http://jashkenas.github.com/coffee-script/

我不太清楚Splats的用途。这是什么建筑?它来自哪里(历史上)

4 个答案:

答案 0 :(得分:197)

术语“splat运算符”来自Ruby,其中*字符(有时称为“splat”-see the Jargon File entry)用于指示参数列表中的条目应“浸泡” “一系列论据。

CoffeeScript很早就采用了Ruby样式的splats(参见issue 16),但在Douglas Crockford的建议下,几周之后语法从*x变为x...(参见issue 45)。尽管如此,CoffeeScripters仍然将语法称为“splat”或“splat operator”。

关于它们实际执行的操作,splats以这样的方式对arguments对象进行切片,使得splatted参数成为所有“额外”参数的数组。最简单的例子是

(args...) ->

在这种情况下,args只是arguments的数组副本。 Splatted参数可以在标准参数之前,之后或之间出现:

(first, rest...) ->
(rest..., last) ->
(first, rest..., last) ->

在前两种情况下,如果函数接收0-1个参数,rest将是一个空数组。在最后一种情况下,函数需要接收超过2个rest的参数为非空。

由于JavaScript不允许具有相同名称的函数的多个签名(C和Java的方式),因此splats可以节省大量时间来处理不同数量的参数。

答案 1 :(得分:13)

如果你知道python,args...大致类似于*args,因为它允许你将函数参数视为列表

例如:

concat = (args...) -> args.join(', ')
concat('hello', 'world') == 'hello, world'
concat('ready', 'set', 'go!') == 'ready, set, go!'

它也适用于分页:

[first, rest...] = [1, 2, 3, 4]
first == 1
rest == [2, 3, 4]

答案 2 :(得分:6)

Splats是使用...运算符用于var-args(带有可变数量参数的函数)的术语。

答案 3 :(得分:3)

我认为这是javascript参数对象的语法糖。

这个想法可能来自ruby的splat operator *