【问题标题】:Why does !== work in my facotrchain function, but not === in Javascript为什么 !== 在我的 facotrchain 函数中起作用,但在 Javascript 中却不是 ===
【发布时间】:2021-07-27 00:01:25
【问题描述】:

为什么我在条件语句中使用 !== 时下面的代码会起作用,

function factorChain(arr) {
  //iterate through array
  for(var i = 0; i < arr.length; i++){
    if(arr[i+1] % arr[i] !== 0){
      return false;
    } 
  }
  //check to see if previous element is a factor of current element
  //if so, return true
  return true;
}
console.log(factorChain([2, 4, 6, 7, 12]));

但是当我将它更改为 === 时,就像在第二部分代码中一样,它不起作用。

function factorChain(arr) {
    //iterate through array
  for(var i = 0; i < arr.length; i++){
    if(arr[i+1] % arr[i] === 0){
      return true;
    } 
  }
  //check to see if previous element is a factor of current element
  //if so, return true
  return false;
}
console.log(factorChain([2, 4, 6, 7, 12]));

【问题讨论】:

  • 针对一项错误测试返回 false 与针对一项正确测试返回 true 不同。第一个示例在返回 true 之前确保 所有 测试为假,如果只有 一个 测试为真,则第二个示例返回 true
  • 在第二个例子中,return true 突然结束了函数,所以如果对于任何迭代,如果 return true 被调用,整个函数都返回 true,如果你 return false 同样适用,因为 return 立即结束函数
  • 你好 Natasha,欢迎来到 SO。如果您希望您的函数充当您的评论,我会说您的第二个答案是无效的,因为一旦找到匹配的模数,它将永久返回。
  • return true 停止函数执行。所以,你的函数已经结束,它不会执行。
  • fwiw const factorChain = arr =&gt; arr.every((x, i, a) =&gt; !(a[i+1]%x));

标签: javascript function if-statement return conditional-statements


【解决方案1】:

为一项错误测试返回 false 与为一项正确测试返回 true 不同。第一个示例确保在返回 true 之前所有测试都为假,而第二个示例在只有一个测试为真时返回 true

我将展示另一种使用inductive reasoningfactorChain 编写为递归函数的方法-

  1. 如果输入数组 arr 的元素少于 2 个,则返回基本结果 true
  2. (电感)输入至少有两个元素。如果第一个元素是第二个元素的一个因子,则返回子问题arr.slice(1)的结果。
  3. (归纳)输入至少有两个元素,并且第一个元素不是第二个元素的因子。返回false

function factorChain (arr)
{ if (arr.length < 2)
    return true                       // 1
  else if (arr[1] % arr[0] === 0)
    return factorChain(arr.slice(1))  // 2
  else
    return false                      // 3
}

console.log(factorChain([ 2, 4, 8, 24, 96 ])) // true
console.log(factorChain([ 2, 4, 8, 20, 40])) // false

Propositional logic 受许多允许我们操纵逻辑表达式并保持正确性的规律的约束。我们可以使用逻辑and折叠逻辑分支2和3,&amp;&amp; -

function factorChain (arr)
{ if (arr.length < 2)
    return true
  else
    return arr[1] % arr[0] === 0 && factorChain(arr.slice(1))
}

console.log(factorChain([ 2, 4, 8, 24, 96 ])) // true
console.log(factorChain([ 2, 4, 8, 20, 40])) // false

我们可以使用逻辑折叠分支 1 和 2,|| -

const factorChain = arr =>
  arr.length < 2 || arr[1] % arr[0] === 0 && factorChain(arr.slice(1))

console.log(factorChain([ 2, 4, 8, 24, 96 ])) // true
console.log(factorChain([ 2, 4, 8, 20, 40])) // false

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-13
    • 1970-01-01
    • 2020-05-20
    • 2019-11-06
    • 1970-01-01
    • 2017-03-12
    • 2020-04-04
    • 2020-10-09
    相关资源
    最近更新 更多