Javascript 这个JS是如何计算奇数还是偶数的

Javascript 这个JS是如何计算奇数还是偶数的,javascript,boolean,arrow-functions,Javascript,Boolean,Arrow Functions,在阅读Javascript Allonge的时候,我被困在试图弄明白为什么会这样 ((n) => { const even = (x) => { if (x === 0) return true; else return !even(x - 1); } return even(n) })(97) 根据提供的数字为奇数或偶数,返回true或false 当我看到它时,我认为它是在检查提供的数字是否为0,如果不是减去1,则再次检查。这意

在阅读Javascript Allonge的时候,我被困在试图弄明白为什么会这样

((n) => {
  const even = (x) => {
    if (x === 0)
      return true;
    else
      return !even(x - 1);
  }
  return even(n)
})(97)
根据提供的数字为奇数或偶数,返回true或false

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


我唯一不知道的是在
返回之前的爆炸!偶数(x-1)

感叹号在JavaScript中是否定的;算法在这条线上所做的是说,无论你给x的值是多少,它都是x-1的对立面,它本质上是串在一起的N
操作,其中N是输入编号。例如,如果N是3,那么
!!!true
false

函数似乎通过简单地附加一个否定运算符将多个递归调用链接在一起
,然后根据最终结果确定号码是偶数还是奇数:

even(2) => !!(true)   => (true)(true)       => true
even(3) => !!!(true)  => (true)(!true)      => (true)(false) => false
even(4) => !!!!(true) => (true)(true)(true) => true
如您所见,它将继续在从零开始的偶数和奇数调用之间交替,从而让您知道结果是偶数还是奇数


这绝对不是解决这个问题的最好办法。

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

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

这段代码的“聪明”之处在于
,它反转函数调用的布尔结果
true
变为
false
false
变为true。您可以重复执行此操作:
!!真的
真的
!!!true
false

基本上,此代码可以简化为以下内容:

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!true;
如果有偶数个
否定,我们最终得到
true
。如果有一个奇数,我们的结果是
false

您引用的代码添加了n
逻辑NOT运算符设置为
true
,其中n是我们正在测试的值。奇数的
s导致
错误
;偶数表示
true


这是一个聪明的代码:它不是用于生产的好代码

完全没有必要使用const和arrow函数——我不相信您正在阅读的指南!o、 在这一点上,他只是在强调函数。关于额外的常量和函数,你是对的!另外,我认为你已经接近了这一点。我相信当它展开递归函数调用堆栈时,
不会
多次调用返回值。因此,对于奇数,它将是一个奇数
!true
将导致false,对于偶数,它将导致偶数的
!true
,这是真的。i、 e.
!!!!!真===假
,和
!!真===真
。另一方面,我不确定为什么任何头脑正常的人会这样做。。哈哈哈(对于!!!!!!!!!!!!!s)。非常感谢。我现在可以睡觉了:)很有道理。这段代码只是他用来解释funcs、闭包和求值表达式的一个示例。所以这是故意夸大的。我对这一点投了更高的票,因为您在示例中实际使用了97个感叹号(这是准确的)。@RionWilliams我想指出,我使用Javascript生成了97个感叹号!这是一章,里面有这段代码。他正在演示写作功能,所以我相信他不会这样写!