我想知道我的逻辑哪里出了问题。将字符串(str
)用作参数(字符串可以是小写,大写,逗号和句点),并设置为等于var string
。然后将其反转,如果它等于原始字符串,则返回值为true
。如果不相等,则显示false
的返回值。为什么将所有内容都评估为真实?
function palindrome(str) {
var string =str.toLowerCase().replace(/\s/g, '').replace(/,/g , '').replace(/./g , '');
if (string==string.split("").reverse().join("")) {
return true;
}
else{
return false;
}
}
palindrome("nope");
最佳答案
tl; dr 将最后一个正则表达式中的.
替换为\.
以去除文字.
s;现在,您正在剥离所有字符。
问题
在正则表达式中,.
匹配任何字符(换行符\n
除外,至少默认情况下除外)。因此,此代码将替换任何字符:
replace(/./g , '')
结果,您正在清空字符串。空字符串的反向是空字符串,因此您总是会得到
true
的返回值。解决方案
要匹配一个字面量,您必须编写
.
来转义\.
。因此,将该部分更改为replace(/\./g , '')
一些重构,使您的代码更加出色
您还可以返回比较结果;这里不需要
if
/ else
块。这将使您的整个代码(为便于阅读而格式化):function palindrome(str) {
var string =str.toLowerCase()
.replace(/\s/g, '')
.replace(/,/g , '')
.replace(/\./g , '');
return string==string.split("").reverse().join("");
}
palindrome("nope");
您可以走得更远,只去除所有非字母字符,因此您的代码可以更加简单:
function palindrome(str) {
var string =str.toLowerCase().replace(/[^a-z]/g, '');
return string==string.split("").reverse().join("");
}
palindrome("nope");