我目前正在打造一个整数位反转方法,只是为了好玩(并且它是递归的,因为递归很酷)。以下是来自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
答案 0 :(得分:2)
原因是您的isundef
函数不检查undefined
的参数。对于任何虚假值e
,表达式!e
为true
。这是e === undefined
的情况,也适用于e
的所有虚假值,例如e === null
,e === 0
等。
因此,当您使用rev(arg, 0)
调用您的函数时,它将无限递归地调用自身。