这个JS如何计算奇数或偶数

leo*_*mes 4 javascript boolean arrow-functions

在阅读 Javascript Allonge 时,我陷入了试图找出原因的困境中;

((n) => {
  const even = (x) => {
    if (x === 0)
      return true;
    else
      return !even(x - 1);
  }
  return even(n)
})(97)
Run Code Online (Sandbox Code Playgroud)

根据提供的数字是奇数还是偶数返回 true 或 false。

当我查看它时,我认为它正在检查提供的数字是否为 0,如果不是减去 1,则再次检查。这意味着数字最终达到 0 并返回 true。这显然不是正在发生的事情,因为 97 返回 false,96 返回 true。

我在这里唯一不知道的是之前的爆炸声return !even(x -1);

lon*_*day 5

哦,这太可怕了,但以一种奇妙的方式。编写代码来检查奇数和偶数是多么好的方法啊!

首先要注意的是,这是一个递归函数:它重复调用自身。每次,它都会减少相关的数字,因此最终会一直下降到0

这段代码所做的“聪明”的事情是!,它反转函数调用的布尔结果。true成为falsefalse成为事实。您可以重复执行此操作:!!trueistrue!!!trueis false

本质上,这段代码可以简化为如下所示:

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!true;
Run Code Online (Sandbox Code Playgroud)

如果有偶数个!否定,我们最终会得到true。如果有奇数,我们最终得到false

您引用的代码将n 个 !逻辑 NOT 运算符添加到true,其中n是我们正在测试的值。奇数个!s 会导致false; 偶数结果为true.

这是聪明的代码:它不是在生产中使用的好代码!它比简单测试慢 1200 倍左右% 2

  • 我对此表示赞同,因为您在示例中实际上使用了 97 个感叹号(而且它是准确的)。 (3认同)
  • @RionWilliams 我想指出的是,我使用 Javascript 来制作 97 个感叹号!所以元。 (3认同)