JS字符串结尾匹配函数:为何for循环返回false?逻辑存疑
字符串结尾匹配函数的逻辑解析
你的函数代码
function confirmEnding(str, target) { let valid = true; console.log(str.length); console.log(target.length); for(let i = 0; i < target.length; i++){ if (str.substring(str.length - (i+1)) == target.substring(target.length - (i+1))){ valid = true; } else{ valid = false; } } console.log(valid); return valid; }
疑问解答
1. 调用confirmEnding("Testing123", "tin5123")为何不返回true?
先拆解参数:
str是"Testing123",长度为9target是"tin5123",长度为7
循环会执行7次(i从0到6),每一次的判断结果如下:
- i=0:取str最后1位
"3"和target最后1位"3"→ 相等,valid=true - i=1:取str最后2位
"23"和target最后2位"23"→ 相等,valid=true - i=2:取str最后3位
"123"和target最后3位"123"→ 相等,valid=true - i=3:取str最后4位
"g123"和target最后4位"5123"→ 不相等,valid=false - i=4:取str最后5位
"ng123"和target最后5位"n5123"→ 不相等,valid=false - i=5:取str最后6位
"ing123"和target最后6位"in5123"→ 不相等,valid=false - i=6:取str最后7位
"ting123"和target最后7位"tin5123"→ 不相等,valid=false
循环结束后,valid的最终值是最后一次循环设置的false,所以函数返回false。你误以为后续循环会把valid变回true,但实际上后面几次的对比均不相等,valid始终保持false。
2. 为什么函数实际是检查target是否匹配str的结尾?
你的循环逻辑本质是从后往前逐位对比两个字符串的对应子串:
- 每次循环i,你取str的最后
i+1个字符,和target的最后i+1个字符做对比。 - 当循环执行到最后一次(i=target.length-1)时,相当于直接对比str的最后
target.length个字符与整个target字符串——这就是在检查str的结尾是否完全等于target。 - 只要任意一次对比不相等,
valid就会被设为false;只有所有对比都通过,最后一次循环才会将valid设为true。
3. 函数返回的valid值由什么决定?
函数返回的是循环最后一次迭代设置的valid值:
- 每次循环都会覆盖
valid的当前值,无论之前是true还是false。 - 只有当所有i对应的对比结果都为true时,最后一次循环的对比(即str最后target.length个字符等于target)才会是true,此时
valid被设为true并返回。 - 只要有任何一次对比失败,哪怕中间有成功的情况,只要最后一次对比失败,
valid就会是false;而如果最后一次对比成功,说明前面所有子串对比必然也成功(因为长串匹配的话,其子串一定匹配)。
内容的提问来源于stack exchange,提问作者Jon
相关产品推荐
相关产品推荐

