为什么我的脚本说'('===')'是真的?
我在 codewars 上做这个 kata。如果传入的第一个参数(字符串)以第二个参数(也是一个字符串)结尾,则该问题希望函数返回 true。所以我写了我的功能,一切工作就好了,直到它比较':-)'与':-('和返回true。
怎么了?我非常自信我的代码应该可以工作,我什至不知道要搜索什么。
function solution(str, ending){
if (!ending) return true; // if ending is a empty string return true (the question wants that)
let ok;
const strArr = str.split(''), endingArr = ending.split('');
for (let i = 0; i < endingArr.length; i++) strArr.reverse()[i] === endingArr.reverse()[i] ? ok = true : ok = false;
return ok;
}
console.log(solution(":-)",":-("));
回答
你的问题是对什么的误解reverse()。它不返回旧数组的反转副本,而是反转现有数组并返回相同的数组。结果,您在循环的每次迭代中不断来回反转数组,导致某些元素被跳过,某些元素被检查两次。
MDN 上的 Array.prototype.reverse()
编辑:
正如其他人在评论中指出的那样,对于问题和这个答案,实际上存在多个问题。
reverse()除此之外,循环始终设置ok为上次比较的结果,从而使函数忽略所有先前的结果。
实现这一点的更简单方法是ok完全删除。相反,false一旦检测到不匹配就返回。如果函数运行的时间足够长以退出循环,则意味着没有检测到不匹配并且true可以返回。
编辑2:
就像一个友好的建议:
虽然两者reverse()并ok与代码真正的问题,我只注意到的第一个第一次就由于代码的格式。ok由于线路太长,问题出在屏幕外。因此,一旦我发现了这个reverse()问题,我就认为就是这样,并没有费心横向滚动来查看其余的代码。
我不会要求您以某种方式编写自己的代码,但是如果您正确格式化它,它会让其他人更容易阅读。从本质上讲,您帮助我们更轻松地帮助您。
例如,这一行:
for (let i = 0; i < endingArr.length; i++) strArr.reverse()[i] === endingArr.reverse()[i] ? ok = true : ok = false;
……阅读起来会容易得多……
for (let i = 0; i < endingArr.length; i++) {
if(strArr.reverse()[i] === endingArr.reverse()[i])
ok = true;
else
ok = false;
}
...或其一些变体。在这里,问题明显更加明显。
- OP 也在每次迭代中重新分配 `ok`,只返回最后一个值。