我正在用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;
}
}
我在第二个方法中哪里做错了?
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;
第二个方法在这里中断:
return true
当返回值为正匹配时,FOR循环终止。
在初始版本中,因为它只设置result = true
,所以FOR
循环继续,直到遇到FALSE,然后显式BREAK
发生。
然而,在另一个版本中,if语句将遇到RETURN FALSE
或RETURN TRUE
,它将只迭代一次,返回结果并结束FOR循环。
在您的第一种情况下,逻辑被退出并返回值false
,只要它满足您的情况中的条件(array.indexOf(string2[i]) == -1)
。
在第二种情况下,数组的第一个元素不满足条件,落入else
条件,因此退出,返回true
。