我是咖啡脚本的新手,所以我想知道我是否做得对。我在JavaScript中有forEach
的原始实现,如下所示:
if(!Array.prototype.forEach){
Array.prototype.forEach = function(callback, context){
for(var i=0; i < this.length; i++){
callback.call(context || null, this[i], i, this);
}
};
}
以下是我目前在咖啡脚本中的写作方式
if not Array.prototype.forEach
Array.prototype.forEach = (callback, context) ->
context ?= null
callback context, @[i], i, @ for i in @
但是我想知道它是否正确,尤其是上下文空检查似乎是多余的以及上下文是否正确应用,就像我仍在使用call
一样。我试着在咖啡脚本中查找关于apply
和call
的一些例子,但到目前为止还没有那么多运气。
答案 0 :(得分:2)
上下文空检查似乎是多余的
好吧,如果它是context
,它还会将null
设置为undefined
。但是,它should实际上变为undefined
。
是否正确应用了上下文,就像我仍在使用call
一样
不,因为你没有使用它。
if not Array.prototype.forEach
Array.prototype.forEach = (callback) ->
context = arguments[1] if arguments.length > 1
for el, i in @
callback.call context, el, i, @ if i of @
undefined
答案 1 :(得分:2)
in
运算符在coffee-script
中完全不同。因此,在coffee-script
中,您的代码将如下所示:
Array::forEach ?= (callback, context) ->
callback.call context, elem, i, @ for elem, i in @
return
我们来看看这段代码。
Array::forEach
只是Array.prototype.forEach
的快捷方式。
?=
表示“如果未分配则分配”。
for elem, i in smth
是coffee-script
in
运算符的一种特殊形式,它允许您捕获元素的索引及其值。通常情况下,for .. in ..
中的coffee-script
运算符仅对值元素进行操作,而不对其索引进行操作。
return
告诉编译器你不想返回最后一个操作的结果,在你的情况下是一个for
循环。没有它coffee-script
将捕获for
循环内的每个调用的结果,然后将它们全部作为单个数组返回。显然,你不希望这项额外的工作完成。
您可以将context
变量的默认值设置为null
,但这不是必需的,因为undefined
的工作原理与null
完全相同。您当前的代码在处理未定义的上下文时以相同的方式处理context = false
。要强制执行此操作,请将context ||= null
添加到函数的开头,但这似乎是多余的。
您还可以使用js2coffee将java-script
翻译为coffee-script
。
答案 2 :(得分:1)
我赞成Bergi的解释答案,但由于coffeescript参数可能有默认值,因此这里的版本稍微清晰一些。
if not Array.prototype.forEach
Array.prototype.forEach = (callback,context = null) ->
for i in @
callback.call context, @[i], i, @ if i of @
undefined