Javascript:对于Loop,需要帮助理解if / else的这个练习

时间:2017-03-11 23:33:34

标签: javascript loops

我有这个练习已经得到答案,但在听完解释后,仍然不明白。这是练习:

  

"写一个函数isUniform(),它接受一个数组作为参数   如果数组中的所有元素都相同,则返回true"

这是解决方案

function isUniform(numArr) {
  var first = numArr[0];
   for (var i = 1; i < numArr.length; i++) {
     if (numArr[i] !== first) {
       return false;
     }
  }
  return true;
}

我得到了它几乎是正确的,但我做了另一个声明与&#34;返回true&#34;它没有用。为什么它适用于&#34;返回true&#34;在for循环之外? (编辑)这是我第一次这样做:

function isUniform(numArr) {
  var first = numArr[0];
  for (var i = 1; i < numArr.length; i++) {
    if (numArr[i] !== first) {
      return false;
    }
    else {
      return true;
    }
  }
}

4 个答案:

答案 0 :(得分:1)

如果你在循环之外返回true,那么它会检查循环中的每个元素,直到匹配if测试它到达循环的末尾。

如果你在循环中返回true,那么它将始终为第一个元素命中return语句,然后停止循环。

答案 1 :(得分:1)

  

我得到了它几乎是正确的,但我用&#34;返回做了另一个声明   真&#34;它没有工作

下面的解决方案在某些情况下会返回错误的结果,因为它所做的就是找到数组中第一个等于 first变量并返回true的元素,即使它没有搜索整个阵列。

   function isUniform(numArr) {
      var first = numArr[0];
      for (var i = 1; i < numArr.length; i++) {
        if (numArr[i] !== first) {
          return false;
        }
        else {
          return true;
        }
      }
    }
  

我有这个练习已经得到答案,但在听完之后   解释,仍然不明白。

让我们假设这是你的数组:

[10,10,13,10,10]

我们假设这是变量first

first  = 10;

如果变量if statement不等于当前索引for loopfirst ( 10 )处的元素,则i内的nth基本上会显示return false数组中的数字)然后first。这是有道理的,因为如果此时变量index与指定index 2 (number 13)处的元素(例如return)不同,那么就没有必要继续进行。因此,它会if (numArr[i] !== first) { return false; } 为假。

[10,10,10,10,10]

现在让我们假设数组是:

first

我们假设这是变量first = 10;

first

现在变量element将与数组中的每个10 is equal to 10进行比较,它表示&#34; 10不等于当前元素&#34;。在这种情况下,因为return而错误。这将向下传播数组,控件永远不会传递到if块内。最终,控制向下传递到if (numArr[i] !== first) { return false; } 真实语句。

        guard let landBackground = childNode(withName: "ground")
        as? SKTileMapNode else {
            fatalError("Background node not loaded")
    }
    self.landBackground = landBackground
    self.tileSize = landBackground.tileSize

    for x in 0...(landBackground.numberOfColumns-1){
        for y in 0...(landBackground.numberOfRows-1){

            let tile = landBackground.tileDefinition(atColumn: x, row: y)
            if(tile != nil){
                let rect = CGRect(x: 0, y: 0, width: tileSize.width, height: tileSize.height)
                let tileNode = SKShapeNode(rect: rect)

                tileNode.position = self.landBackground.centerOfTile(atColumn: x, row: y)

                tileNode.position.x -= (tileSize.width * 0.5)
                tileNode.position.y -= (tileSize.height * 0.5)

                tileNode.physicsBody = SKPhysicsBody(rectangleOf: tileSize, center: tileNode.position)
                tileNode.physicsBody?.isDynamic = false
                tileNode.physicsBody?.collisionBitMask = playerCategory|groundCategory

                //tileNode.physicsBody?.contactTestBitMask = playerCategory
                tileNode.physicsBody?.categoryBitMask = groundCategory
                landBackground.addChild(tileNode)
            }
        }
    }

答案 2 :(得分:0)

它有效,因为它是函数中的最终语句。基本上,如果for循环中的条件不会被触发,你的函数将返回true

答案 3 :(得分:0)

让我们说你有一台破损的打印机,它偶尔会打印出打印输出。现在你打印了20份,想知道每篇论文是否合适。那么现在你必须迭代地比较每个副本,直到找到一个不匹配的副本(并知道它是时候得到一台新的打印机?)。或者你已经走过了堆栈并且知道每个副本都没问题(而且你浪费了时间)。