我在下面列出了一个问题和两个答案。答案背后的逻辑似乎与我相同,但解决方案A有效,而解决方案B返回'false',除非'x'是字符串的第一个字母。那是为什么?
问题:
编写一个名为hasX()的函数。它应该作为输入一个字符串,如果字符串包含字符'x',它应该返回true,如果不包含字符'x'则返回false。
解决方案A:
function hasX(s) {
for (var i = 0; i < s.length; i++)
if (s[i] === 'x') {
return true;
} if (s[i] !== 'x') {
return false;
}
}
hasX('I play the xylophone');
// returns true
解决方案B:
function hasX(s) {
for (var i = 0; i < s.length; i++)
if (s[i] === 'x') {
return true;
} else {
return false;
}
}
hasX('I play the xylophone');
// returns false
答案 0 :(得分:3)
这里的区别在于,在第一个示例中,您有两个 if
语句,而在第二个示例中,您有一个 if-else
语句。由于您的for
循环没有任何大括号,因此它只包含第一个语句,因此正确嵌套后,它们就像这样:
for
if
if
for
if-else
在第一个示例中,第二个if
将在循环完成后执行,如果完成的话。在第二个示例中,整个if-else
在循环的每次迭代中执行。
第一个循环迭代,直到找到值为x
的字符或到达数组的末尾,而第二个循环立即返回,因为第一个字符是x
或者它不是&# 39;吨
实际上,您不需要两个条件。你可以正确编写你的函数:
function hasX(s) {
for (var i = 0; i < s.length; i++) {
if (s[i] === 'x') {
return true;
}
}
// didn't find an x
return false;
}
console.log(hasX('I play the xylophone'));
console.log(hasX('I play the piano'));
&#13;
我建议总是在循环体和if
语句周围使用大括号。它有助于防止像这样的偷偷摸摸的错误。
答案 1 :(得分:1)
在你的情况下,两者之间在逻辑上没有区别,如果&#34;或&#34; if / else&#34;声明。 这个例子将告诉你一般的区别: 例1:
function name{
if(condition 1){ //Task1; }
if(condition 2){ //Task2; }
}
在此示例中,如果两个条件都为真,则除非循环返回一个值(停止执行其他代码),否则代码将贯穿两个循环。
示例2:
function name{
if(condition1){ //Task1; } //loop1
else{ //Task 2; } //loop2
}
在这个例子中,代码将运行loop1(如果&#34; condition1&#34;为真)或循环2(否则),所以你的代码只运行其中一个循环。
答案 2 :(得分:0)
如果-ELSEIF:强>
start;
if() \\true
break;
end;
IF = FALSE - 转到ELSE-IF。如果为TRUE - 中断。
如果-IF:强>
start;
if() \\true
if()
end;
执行2 IF&#39>。
答案 3 :(得分:0)
这与效率和需求有关。如果陈述是彼此独立执行的。每个人都会跑。否则if语句仅在前一个if失败时才执行。 :)
答案 4 :(得分:-1)
这两个函数都会返回false
,因为它们都会测试第一个字符并返回。
您要做的只是在角色为==&#39; x&#39;时才返回true
。如果不是,你也不想回来。您需要允许循环继续并检查下一个字符。
只有在您检查了所有字符并且您的循环结束后,您才知道该字符串没有&#39; x&#39;,所以只有这样才能返回false。