确认字符串结尾函数问题咨询:自定义代码为何始终返回false?
问题分析与修复方案
嘿,我来帮你拆解下这段代码为啥总是返回false~你的思路方向是对的,但有几个关键细节没处理好:
1. 数组不能直接用==比较(最核心的问题)
在JavaScript里,数组是引用类型,==或者===比较的是两个数组的内存地址,而不是它们的内容。哪怕两个数组里的元素完全一样,只要是不同的数组对象,结果都是false。比如:
console.log(["a","b"] == ["a","b"]); // 输出 false
所以你最后写的return ending==targetArray不管ending内容对不对,都会返回false,这是最直接的原因。
2. ending数组的构建逻辑冗余且有漏洞
你原本想通过push字符或0来记录匹配结果,但其实完全不需要构建这个数组:
- 只要有一个字符不匹配,我们可以直接提前返回false,不用继续循环
- 就算全匹配,构建数组再比较也是多此一举,还容易出错
3. 字符串转数组是没必要的操作
JavaScript里字符串本身就可以通过索引直接访问字符(比如str[0]),不需要先转成数组,这会额外增加性能开销。
修复后的代码(遵循你的思路优化)
我们可以直接在循环里逐位比较,一旦发现不匹配就返回false,全匹配则返回true:
function confirmEnding(str, target) { // 先判断str长度是否小于target,直接返回false if (str.length < target.length) return false; // 计算str需要开始比较的起始位置 const startIndex = str.length - target.length; // 逐位比较target和str对应位置的字符 for (let i = 0; i < target.length; i++) { if (str[startIndex + i] !== target[i]) { return false; } } return true; }
更简洁的写法(利用JS内置方法)
其实JavaScript字符串有更方便的slice方法,直接截取str的最后target.length位和target比较就行了:
function confirmEnding(str, target) { return str.slice(-target.length) === target; }
内容的提问来源于stack exchange,提问作者yeseula
相关产品推荐
相关产品推荐

