Javascript 为什么这个函数返回true?

Javascript 为什么这个函数返回true?,javascript,function,recursion,lambda,functional-programming,Javascript,Function,Recursion,Lambda,Functional Programming,由于参数中使用了42,但它表示仅当x为0且严格等于其类型和值时才返回true,因此我不确定为什么返回true。我认为除了0以外的任何值都应该返回false。有人能给我解释一下吗,我对javascript和编程非常陌生。如果你用本地函数和IILife去掉所有不必要的部分,那么你得到的只是一个零测试,那么它是一个偶数值,或者是一个递归调用not偶数,值减少了1 const偶数=x=>x==0 | |!偶数(x-1); console.log(偶数(42))//true log(偶数(43))//f

由于参数中使用了42,但它表示仅当x为0且严格等于其类型和值时才返回true,因此我不确定为什么返回true。我认为除了0以外的任何值都应该返回false。有人能给我解释一下吗,我对javascript和编程非常陌生。

如果你用本地函数和IILife去掉所有不必要的部分,那么你得到的只是一个零测试,那么它是一个偶数值,或者是一个递归调用not偶数,值减少了1

const偶数=x=>x==0 | |!偶数(x-1);
console.log(偶数(42))//true
log(偶数(43))//false
让我们简化

第一步

const res = (n => {
  const even = x => {
    if (x === 0)
      return true
    else {
      const odd = y => !even(y)
      return odd(x - 1)
    }
  }
  return even(n)
})(42)

console.log(res) //=> true
步骤2

const f = n => {
    const even = x => {
        if (x == 0)
            return true
        else {
            const odd = y => !even(y)
            return odd(x - 1)
        }
    }

    return even(n)
}
步骤3

const f = n => {
    const even = x => {
        if (x == 0) return true
        return !even(x - 1)
    }

    return even(n)
}
步骤4

const f = n => {
    let modificator = true

    while (true) {
      if (n == 0) return modificator
      modificator = !modificator
      n = n - 1
    }
}

该代码通过使用递归进行偶数/奇数次求反来工作。偶数次求反
true
得到
true
。奇数次求反
true
得到
false
。忘记
42
检查
1
2

若打开控制台,也可以看到堆栈跟踪

const f = n => !(n % 2)

x是0,严格等于它的类型和值,我不知道为什么 返回true

这发生在递归的尾部,当每个递归调用使用
处的否定完成时,
true
true
false
之间来回切换!偶数(y)

const res=((n)=>{
常数偶数=(x)=>{
如果(x==0){
控制台日志(x);
console.trace();
返回true;
}
否则{
常数奇数=(y)=>!偶数(y);
控制台日志(x);
console.trace();
返回奇数(x-1);
}
}
返回偶数(n)
})(2) //=>正确

控制台日志(res)
函数循环减去1,直到达到0,然后返回true。在这里你可以看到它的工作:@Baruch
43
会发生什么?应该注意的是,这是一种荒谬的不切实际和低效的检查数字是否为偶数的方法。如果您计划实际使用此代码,请不要编写此代码。或者
偶数=(num)=>!(数量%2)@keja,对,但原始函数是将参数倒计时到零,然后停止迭代。
return even(2) =>
even(2) => odd(2 - 1)
odd(1) => return !even(1)
!even(1) => ! (odd(1-1))
! (odd(0)) => ! ( !(even(0))) => even(0)
even(0) => true
return even(1) =>
even(1) => odd(1 - 1)
odd(0) => !even(0)
!even(0) => !(true) => false