JavaScript:不用endsWith实现字符串结尾匹配的函数问题排查
解决字符串结尾匹配问题(不用
endsWith()) 嘿,我完全懂你遇到的困惑!直接拿数组对比失效的核心原因是:JavaScript里的数组是引用类型——哪怕两个数组的内容完全一模一样,它们也是内存里的不同对象,用===或者==比较时,其实是在判断它们的引用地址是否相同,而不是内容是否一致。举个直观的例子:
console.log(['a','b'] === ['a','b']); // 输出 false
但把数组用join("")转成字符串后,就变成了值类型的比较,只要内容相同就会返回true,这就是为啥转字符串后能生效的原因。
下面给你几种优化后的实现方案,都不用endsWith()方法:
方案1:基于你的数组思路改进
const confirmEnding = (str, target) => { // 处理target长度大于str的边界情况,直接返回false if (target.length > str.length) return false; // 截取str末尾和target长度一致的字符数组,转成字符串 const strEndPart = str.split("").splice(str.length - target.length, target.length).join(""); // 和target字符串直接对比 return strEndPart === target; };
这个方法延续了你原本的思路,补充了边界判断(避免target比str长时出现错误截取),同时通过join()把数组转成字符串后做值比较。
方案2:直接操作字符串(更高效)
其实不用转数组也能实现,直接用字符串的slice方法截取末尾部分,效率更高:
const confirmEnding = (str, target) => { const startPos = str.length - target.length; // 如果target比str长,肯定不匹配 if (startPos < 0) return false; // 截取从startPos到结尾的字符串,和target对比 return str.slice(startPos) === target; };
这个方法省去了数组转换的步骤,性能更好,代码也更简洁。
方案3:逐个字符对比(性能最优)
如果追求极致性能,可以从字符串末尾开始逐个对比字符,一旦发现不匹配就直接返回false,不用处理整个字符串:
const confirmEnding = (str, target) => { const strLen = str.length; const targetLen = target.length; if (targetLen > strLen) return false; // 从最后一个字符开始往前对比 for (let i = 0; i < targetLen; i++) { const strChar = str[strLen - 1 - i]; const targetChar = target[targetLen - 1 - i]; if (strChar !== targetChar) { return false; } } return true; };
这个方法在遇到不匹配的字符时会立刻终止循环,适合处理超长字符串的场景。
总结一下:以后遇到引用类型(数组、对象)的对比需求,千万别直接用===,要么转成值类型对比,要么逐个元素/属性校验~
内容的提问来源于stack exchange,提问作者Victor Evangelista
相关产品推荐
相关产品推荐

