Javascript 为什么';TJS高尔夫中未定义的工作?

Javascript 为什么';TJS高尔夫中未定义的工作?,javascript,recursion,undefined,stack-overflow,Javascript,Recursion,Undefined,Stack Overflow,我目前正在玩一个整数数字反转方法,只是为了好玩(递归很酷,所以它是递归的)。以下是产生的代码: 请注意,UglifyJS使用void 0作为未定义的的同义词,这是 我无意中发现了这项针对未定义的测试: function isundef(x) { return !!!x; } 因为undefined测试的目的是将一个helper方法风格的递归算法塞进一个可以使用适当参数重新调用自身的函数中,所以我只是尝试用isundef(e)替换void 0==e 在Chrome最新版本中,这不起作用。我得

我目前正在玩一个整数数字反转方法,只是为了好玩(递归很酷,所以它是递归的)。以下是产生的代码:

请注意,UglifyJS使用
void 0
作为
未定义的
的同义词,这是

我无意中发现了这项针对
未定义
的测试:

function isundef(x) {
  return !!!x;
}
因为
undefined
测试的目的是将一个helper方法风格的递归算法塞进一个可以使用适当参数重新调用自身的函数中,所以我只是尝试用
isundef(e)
替换
void 0==e

在Chrome最新版本中,这不起作用。我得到一个
范围错误:超过了最大调用堆栈大小
为什么
isunde
不能在这种上下文中测试
undefined

编辑:

为什么一部电影也不工作

function rev(r,e){var n=r%10;return e?0==r?e:n==r?10*e+r:rev((r-n)/10,10*e+n):rev(r,0)}

原因是您的
isundef
函数没有检查
undefined
的参数。对于任何falsy值
e
,表达式
!e
。这适用于
e===undefined
,也适用于
e
的所有错误值,例如
e===null
e===0
,等等


因此,当您使用
rev(arg,0)
调用函数时,它将无限递归地调用自己。

顺便说一句,在您迁移或关闭代码之前,这个问题实际上是关于JS语法,而不是高尔夫策略。为什么不使用
return typeof e==“undefined”
?如果
e
确实是未定义的,如在“未声明”中,仅测试
e
将给您一个错误@因为这是代码高尔夫。我也只是在尝试创新。
!!!x
对于所有虚假值都是真的,例如false',等等。所以,为什么
!!!e
?为什么不干脆
!e
function rev(r,e){var n=r%10;return isundef(e)?rev(r,0):0==r?e:n==r?10*e+r:rev((r-n)/10,10*e+n)}
function rev(r,e){var n=r%10;return e?0==r?e:n==r?10*e+r:rev((r-n)/10,10*e+n):rev(r,0)}