我目前正在研究整数数字反转方法只是为了好玩(它是递归的,因为递归很酷)。这是来自 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 .
我偶然发现了这个未定义
的测试:
function isundef(x) {
return !!!x;
}
因为 undefined
测试的目的是将辅助方法风格的递归算法塞进一个可以使用适当参数重新调用自身的函数中,所以我只是尝试替换 void 0 ==e
与 isundef(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)}
在最新的 Chrome 中,这不起作用。我收到 RangeError:超出最大调用堆栈大小
。 为什么在这种情况下 isundef
不能用于测试 undefined
?!!!
编辑:
为什么 truthiness test 没有工作吗?
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
。对于任何假值 e
,表达式 !e
为 true
。 e === undefined
就是这种情况,而且 e
的所有假值也是如此,例如 e === null
、e === 0
,等等
因此,当您使用 rev(arg, 0)
调用函数时,它将无限递归地调用自身。
关于javascript - 为什么 !!!undefined 在 JS Golf 中不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25146706/