Javascript 为什么';TJS高尔夫中未定义的工作?
我目前正在玩一个整数数字反转方法,只是为了好玩(递归很酷,所以它是递归的)。以下是产生的代码: 请注意,UglifyJS使用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最新版本中,这不起作用。我得
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)}