【发布时间】:2013-07-27 20:34:39
【问题描述】:
我有一个函数应该返回除第一个参数以外的所有参数
foo = -> arguments[1..]
foo(0,1,2,3,4)
不幸的是,arguments 不是一个数组而是一个对象。
将对象转换为数组的最佳方法是什么?
【问题讨论】:
标签: arrays coffeescript
我有一个函数应该返回除第一个参数以外的所有参数
foo = -> arguments[1..]
foo(0,1,2,3,4)
不幸的是,arguments 不是一个数组而是一个对象。
将对象转换为数组的最佳方法是什么?
【问题讨论】:
标签: arrays coffeescript
找到的是使用Array.prototype.slice:
coffee> foo = -> Array.prototype.slice.apply(arguments)[1..]
[Function]
coffee> foo(0,1,2,3,4)
[ 1, 2, 3, 4 ]
另一个版本是
[].slice.call(arguments)
【讨论】:
::代替prototype:Array::slice.apply...
【讨论】:
(args...) 的“我是一个可变参数函数”的明确性,直接使用arguments 并不总是能给你带来好处。跨度>
args... 本质上是被咖啡脚本编译器变成了[].slice.call(arguments)
args[1..-1] 对我来说有点不必要的混乱。我的偏好是改用args[1..]。我确实承认,在撰写答案时可能并非如此。
您可以忽略第一个参数并使用 splats 捕获其余参数:
foo = (_, rest...) -> rest
您也可以执行foo = (args...) -> args[1...] 之类的操作,但那将是compile to 对Array#slice (unlike the first snippet) 的两次不同调用。
【讨论】:
[1...] 只是为了说明我不能进行数组操作...
arguments 视为数组的惯用方法是简单地将函数声明为 (args...) ->,然后使用 args 这是一个真正的数组。