带大括号的 If / Else 语句

If / Else statement with curly braces

我正在尝试创建一个具有两个参数的函数,一个用于数组 (ary),第二个用于将在数组内搜索的名称。

但是,我不明白为什么第一个代码不起作用而第二个代码起作用。

有人能解释一下吗?

// wrong code
var fruit = ['banana', 'apple', 'cherry', 'watermelon'];
var food = ['pizza', 'rice', 'cheese', 'potato'];
var search = function(ary, name) {
    for (var i = 0; i < ary.length; i++) {
        if (name == ary[i]) {
            return name + " was found!";
        } else {
            return name + " was not found";
        }
    }
};
search(food, 'potato');
//"potato was not found"


// right code
var fruit = ['banana', 'apple', 'cherry', 'watermelon'];
var food = ['pizza', 'rice', 'cheese', 'potato'];
var search = function(ary, name) {
    for (var i = 0; i < ary.length; i++)
        if (name == ary[i]) 
            return name + " was found!";
    return name + " was not found";
};

search(food, 'potato');
//"potato was found!"

谢谢!

在第一个示例中,您将在第一次匹配失败时 return,因此在匹配数组的第一项失败后,它将从函数中 return。

所以 else 块中的部分应该移到循环之外。

因为在第一个函数中,uou 在一次迭代后立即 return;您不必等待整个数组遍历;我敢打赌数组的第一个元素是 'found'.

因此,对于您的第一个函数,将找到这些:

search(fruit, 'banana');
search(food, 'pizza');

但没有其他人。

在第二个中,returning 'not found' 仅在整个数组已循环遍历但未找到匹配项时才会发生,即当它退出 for 循环时。

我明白了。

在第一个代码段中,您在 else 语句中 returning 为 false。这意味着第一次通过循环时,您将 return 为真或为假。它只检查第一项。

在您的第一个版本中,elsefor 循环中,因此该函数将始终 return "was found" 或 "was not found"第一次迭代。循环永远不会到达它的第二次迭代。

在你的第二个版本中,else 不是 for 循环体的一部分,所以它只在循环完成后运行(运行 它的所有迭代)而没有找到匹配。

for (var i = 0; i < ary.length; i++)
    if (name == ary[i]) 
        return name + " was found!";
return name + " was not found";

等同于:

for (var i = 0; i < ary.length; i++) {
    if (name == ary[i]) {
        return name + " was found!";
    }
}
return name + " was not found";

它 return false 在遍历数组中的所有项目之后。在您提供的错误代码中,它只检查第一项是否等于 name 因为在循环中您 return 无论是否找到它(因此如果第一项等于 name 它将 return true,否则它将 return false) 所以来自索引 1 的项目将不会被检查,因为函数已经 returned.


注意: 你可以使用 JS 中的默认搜索功能:indexOf 像这样:

var search = function(ary, name) {
    if(ary.indexOf(name) != -1) // index is -1 (not valid) then it's not found
        return name + " was found";
    else
        return name + " was not found";
}