如果我在一个函数中返回两次,第二个会覆盖第一个吗?

时间:2015-10-20 03:22:29

标签: javascript return

我正在用Javascript编写一个函数。基本上,如果数组的第一个元素中的字符串包含数组第二个元素中字符串的所有字母,它应该返回true。我在输入["hello","hey"]

上测试我的函数
    function mutation(arr) {
      var string1 = arr[0].toLowerCase();
      var array=[];
      for (i=0;i<=string1.length-1;i++) {
        array[i]=string1[i];
      }

      var string2 = arr[1].toLowerCase();

      var result = true;

      label:
      for(i=0;i<string2.length;i++) {
        if (array.indexOf(string2[i]) == -1) {
          result = false;
          break label;
        }
        else {
          result = true;
        }
      }

      return result;

    }

这会给我正确的结果false。但是,如果我以不同的方式编写循环,那么它会给我true

  label:
  for(i=0;i<string2.length;i++) {
    if (array.indexOf(string2[i]) == -1) {
      return false;
      break label;
    }
    else {
      return true;
    }
  }

我的第二种方法在哪里做错了?

3 个答案:

答案 0 :(得分:2)

return语句立即终止该函数。在第二个实现中,早期返回false确实是正确的,但return true语句是错误的 - 它将在第一个元素中返回true而不包含在第二个数组中。实际上,你是在否定循环 - 只检查第一个元素,并立即返回一个值。

您的目的是提前返回false值:

for (i = 0; i < string2.length; i++) {
    if (array.indexOf(string2[i]) == -1) {
      return false;
    }
}
// If we finished the loop and haven't returned false, the return value is true:
return true;

答案 1 :(得分:1)

此时你的第二种方法破裂了:

return true

在肯定匹配中返回的那一刻,你的FOR循环终止。

在您的初始版本中,因为它只设置result = true,所以FOR循环会继续,直到遇到FALSE,然后您的显式BREAK就会出现。

但是,在另一个版本中,if语句将遇到RETURN FALSERETURN TRUE,它只会迭代一次,返回结果并结束FOR循环。

答案 2 :(得分:-1)

在第一种情况下,逻辑被退出并返回值false,只要它满足您案例中的(array.indexOf(string2[i]) == -1)条件。

在第二种情况下,数组的第一个元素不满足条件并进入else条件,因此退出true