写于2015年3月26日,最新修订于2017年5月29日,可能已过时,请谨慎参考。
判断一个字符串是否是回文字符串,也算是比较常见的面试题。对于“训练有素”的前端从业者,很轻松就能写出:
function test(str) {
return str.split('').reverse().join('') === str;
}
足够简单,虽然没啥技术含量,性能也一般。即使是老老实实地用循环写,也不是一件复杂的事情:
function test(str) {
const length = str.length;
for (let i = 0; i <= length / 2; i++) {
if (str[i] !== str[length - i - 1]) {
return false;
}
}
return true;
}
不过这样也就没有意思了。还是来挖掘一点更有趣的玩法吧。怎么玩?用正则试试。
通常,正则无非就是抽象出字符串中的通用模式。回文字符串显然是有规律的,那么就是有希望用正则来处理:
function test(str) {
const arr = Array.from({ length: Math.floor(str.length / 2)});
const regExpStr = arr.fill('(.)')
.concat(str.length % 2 ? ['.'] : [])
.concat(arr.map((_, index) => `\\${arr.length - index}`))
.join('');
return new RegExp(`^${regExpStr}$`).test(str);
}
只要字符串长度确定,正则表达式内容是确定的,因此构造正则表达式的过程可以缓存。至于性能和可读性,那就呵呵了,你要在业务逻辑里面写这种代码,还是赶快准备简历吧。