循环,迭代和返回-加深了解

时间:2019-07-15 10:44:58

标签: javascript

所以我有一个loop的简单代码,它遍历数组并使用一些条件语句来记录字符串。

myArray = [12, 17, 19]

function testLoop () {
  for (let i = 0; i < 3; i++) {
    console.log(i);

    if (myArray[i] == 12) {
      console.log('is 12')
    } else if (myArray[i] == 17) {
      console.log('is 17')
    } else {
      console.log('Default')
    }
 }
};

testLoop();



myArray = [12, 17, 19]

    function testLoop () {
      for (let i = 0; i < 3; i++) {
        console.log(i);

        if (myArray[i] == 12) {
          return 'is 12'
        } else if (myArray[i] == 17) {
          return 'is 17'
        } else {
          return 'Default'
        }

     }
    };

    testLoop();

现在我的问题是,我们在函数中使用return,但是现在输出为0,控制台中没有其他内容。我知道返回字会终止执行,我真的不明白为什么这会阻止迭代的发生。理想情况下,一个函数还需要返回一些东西才能使其可测试。

请有人可以清楚地详细解释为什么这些条件条件不会在循环中运行,以及为什么我们没有循环遍历myArray的每个项目并返回结果。

3 个答案:

答案 0 :(得分:0)

这种写法:

myArray = [12, 17, 19];

function testLoop () {
  for (let i = 0; i < 3; i++) {
    console.log(i);

    if (myArray[i] == 12) {
      return 'is 12'
    } else if (myArray[i] == 17) {
      return 'is 17'
    } else {
      return 'Default'
    }

 }
};

console.log(testLoop());

return子句将在第一次迭代时被命中,并且循环将终止,因为遇到返回时函数执行本身会立即结束。

控制台将日志记录为0,因为它是循环console.log(i)的第一条语句。

我添加了一个test.return的console.log来显示它在第一次迭代中返回“ is 12”。

我认为您期望的是类似yield的东西,它允许循环中的返回值在迭代器中进行转换

答案 1 :(得分:0)

首先,您不应该对两个声明使用相同的函数名,其次,您要做的就是console.log返回的值,以便它可以打印返回的值。 在这里看到小提琴:https://jsfiddle.net/v63wgpf4/

myArray = [12, 17, 19]

function testLoop () {
  for (let i = 0; i < 3; i++) {
    console.log(i);

    if (myArray[i] == 12) {
      return 'is 12'
    } else if (myArray[i] == 17) {
      return 'is 17'
    } else {
      return 'Default'
    }

 }
}

console.log(testLoop());

答案 2 :(得分:0)

如Nina所说,return结束了功能,您应该使用yeld关键字:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/yield

function* foo () { 
	yield 12;
	yield 17;
	yield 19;
}
const iterator = foo();
var index = 0;
while (index++ < 3)
  console.log (iterator.next().value);