CoffeeScript`?`运算符
我可以使用什么输入使此函数抛出所需的CoffeeScript`?`运算符,coffeescript,Coffeescript,我可以使用什么输入使此函数抛出所需的值…错误 requiresValue = (fn) -> -> throw "Value required" unless arg? for arg in arguments fn.apply(this, arguments) foo = (x) -> x console.log requiresValue(foo)(undefined) # returns undefined console.log requir
值…
错误
requiresValue = (fn) ->
->
throw "Value required" unless arg? for arg in arguments
fn.apply(this, arguments)
foo = (x) ->
x
console.log requiresValue(foo)(undefined) # returns undefined
console.log requiresValue(foo)(null) # returns null
考虑到我在REPL中的测试,我不明白为什么传入undefined
或null
不会导致引发异常:
coffee> null?
false
coffee> undefined?
false
返回布尔值的列表。它不是空的,被评价为真实的
您的测试可以是(编辑:参数
显然不是一个真实的数组,因此我们首先需要一个真实的数组):
(编辑:添加了参数空测试)此版本的测试可能会让事情更清楚:
requiresValue = (fn) ->
->
for arg in arguments
if not arg?
throw 'value error'
fn.apply(this, arguments)
它在功能上应该与njzk2的答案类似,除了没有参数的情况(我没有args.length
test)
还要注意编译代码中的arg?
呈现为:
if (arg == null) {
throw 'value error';
}
在Javascript中,==null有一个明确的功能。在原始的
arg?对于参数中的arg
,为什么以下返回输入不会抛出错误?requiresValue(foo)([])
(返回[])或requiresValue(foo)(
(返回未定义)或`requiresValue(foo)`(返回函数“?.P.S如果我理解正确,检查的目的是在没有参数存在时抛出错误,对吗?[]
被认为是真实的。但是,请注意args.every(arg)->arg?
如果args中没有项,也会被认为是正确的。我只是添加了args.length和
来断言args为空的情况。另外,在requiresValue(foo)([])
中,参数是[[]
(它包含一个空数组的元素)这使得它成为一个有效的输入,即使你认为应该至少有一个元素(除非你想考虑<代码> []/COD>不是一个有效的输入,在这种情况下,<<代码>每个< /代码>中的函数需要稍微复杂一些。@KevinMeredith:如果没有参数存在
则不完全正确。原始函数测试参数是否有效。在这种情况下,没有参数将被视为有效。我编辑的函数拒绝空参数。若要仅在没有参数时进行测试,抛出“Value required”除非参数.length
足够长,否则我通常会看到如果不是arg?
编译为if(typeof arg==“undefined”| arg==null)
(到目前为止,我在咖啡中从未见过编译为=
,只有=
)把if not arg?
放在一个循环中,看看更简单的版本。哇。这太奇怪了。我想知道为什么会有不同的处理方式。x==null
是一个安全的测试,如果我们知道x
已经被赋值,比如在a.x==null
或循环中。但是如果我在节点中x==null
我得到一个ReferenceError
。测试时间越长越好。因此必须先测试它是否未定义,但在循环中它不能未定义,因为它刚刚定义。这很有意义。
requiresValue = (fn) ->
->
for arg in arguments
if not arg?
throw 'value error'
fn.apply(this, arguments)
if (arg == null) {
throw 'value error';
}