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';
  }