为什么JS高尔夫球场没有未定义的工作?

时间:2014-08-05 19:21:31

标签: javascript recursion undefined stack-overflow

我目前正在打造一个整数位反转方法,只是为了好玩(并且它是递归的,因为递归很酷)。以下是来自UglifyJS的代码:

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

请注意,UglifyJS使用void 0作为undefined的同义词,is probably a better choice in everyday programming

我偶然发现了undefined的这个测试:

function isundef(x) {
  return !!!x;
}

因为undefined测试的要点是将一个辅助方法式的递归算法塞进一个可以用适当的参数重新调用自身的函数,我只是尝试用{{替换void 0==e 1}}。

isundef(e)

在Chrome最新版本中,这不起作用。我得到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)} 为什么RangeError: Maximum call stack size exceeded在这种情况下不能用于isundef的测试?!!!

编辑:

为什么truthiness test也不起作用?

undefined

1 个答案:

答案 0 :(得分:2)

原因是您的isundef函数不检查undefined的参数。对于任何虚假值e,表达式!etrue。这是e === undefined的情况,也适用于e的所有虚假值,例如e === nulle === 0等。

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