我正在用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;
}
}
我的第二种方法在哪里做错了?
答案 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 FALSE
或RETURN TRUE
,它只会迭代一次,返回结果并结束FOR循环。
答案 2 :(得分:-1)
在第一种情况下,逻辑被退出并返回值false
,只要它满足您案例中的(array.indexOf(string2[i]) == -1)
条件。
在第二种情况下,数组的第一个元素不满足条件并进入else
条件,因此退出true
。