寫于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);
}
只要字符串長度確定,正則表達式內容是確定的,因此構造正則表達式的過程可以緩存。至于性能和可讀性,那就呵呵了,你要在業務邏輯里面寫這種代碼,還是趕快準備簡歷吧。