筆者最近在一邊看《JS高級程序設計3》一邊在FCC上找題目練習啊。那叫一個爽。這不,剛剛用生命在課堂,寢室,實驗室,圖書館等各類場所將第五章「引用類型」搞定,FCC便知趣的給筆者來了個「迴文數」,筆者咬牙切齒,花了兩天時間,又是研究數組,又是研究字符串,又是研究做用域,還看了很長時間的正則表達式。還好,不負有心人,嘿嘿嘿,如今爲你們詳細分享用JS實現精準迴文數的辨別!!!javascript
先給你們看幾個類型的字符串:html
race carjava
not a palindrome正則表達式
A man, a plan, a canal. Panama數組
My age is 0, 0 si ega ym.瀏覽器
0_0 (: /-\ :) 0-0spa
麻煩啊,又是字母,又是數字,還有下劃線,空格,點等等不知道什麼東西。。。
設計
因此,咱們第一步要作的就是,將不是數字和字母的通通去掉!!!code
這裏,用到第一個方法了,名字叫作replace(),這裏咱們重點分享思路,不清楚replace()還有下面一些其它方法的同窗本身去查詢哦。htm
好了,咱們大概的思路是,replace(exp,"").意思就是,匹配全部的非字符,而後去掉它。
那麼問題就來了,正則表達式怎麼匹配全部的非字符呢?
這個問題但是讓我想破了腦殼啊-.-
開始的時候,有朋友建議我用\s後來才知道,它匹配的是空白字符,因此一些符號倒是沒法匹配到的
通過了我對正則表達式的一番研究,加上和朋友的一些探討(登門請教的哦~),終於讓我找到了方法
\W+匹配全部的非字符
由於,\w匹配的是數字,字母,因此\W 就是反義了。
然而還沒完呢,\W它匹配不了下劃線,因此咱們還得再加上\_+
1 var newStr= str.replace(/\W+/g,'');//匹配全部非單詞的字符,替換爲空字符串 2 newStr= newStr.replace(/\_+/g,'');//匹配全部下劃線,替換爲空字符串 3 newStr=newStr.toLowerCase();
到這裏,咱們便解決了大小寫問題和非字符的干擾
接下來,只要利用引用類型裏的方法,肯定它是迴文數就能夠了。
好,咱們的思路是,將獲得的字符串轉換成數組arr1,而後將數組反轉獲得另外一個數組arr2,
只須要for循環兩個數組arr1【i】==arr2【i】,若是是迴文數,那麼毫無疑問,等式是成立的,若是不是迴文數,等式不成立
1 var arr1= newStr.split('');//將獲得的字符串轉換成數組 2 var arr2=arr1.reverse();//將數組反轉,獲得另外一個數組 3 for(i=0;i<arr1.length;i++){ 4 if(arr1[i]==arr2[i]){ 5 return true; 6 }else{ 7 return false; 8 } 9 }
看起來好像沒問題呀~
當我滿懷信心的運行時,瀏覽器並無給我期待的答案:(
問題出在哪裏呢?
不知道你們記不記得數組是什麼類型呢?
對!!!數組是引用類型!!!arr1與arr2都指向同一個堆啊!!!
當咱們寫下arr1.reverse()時,這個堆便改變了,反轉了!!!這纔是問題的關鍵!!!因此咱們在for()循環裏比較的居然時兩個一樣的數組!!!(Oh My God!!!)
問題找出來了,怎麼解決?
很簡單,既然數組不行,那我就用基本類型裏的String!!!
咱們將反轉後的數組再轉換成字符串,而後比較兩個字符串
var newStr2=arr2.join(''); //重構倒序的字符串 if(newStr==newStr2){//比較1 return true; }else{ return false; }
這樣,用JS判斷迴文數的整個思路就出來啦~
下面是完整的代碼,你們能夠複製下來運行下哦
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8" /> 5 <title></title> 6 </head> 7 <body> 8 <script type="text/javascript"> 9 function palindrome(str) { 10 // Good luck! 11 var newStr= str.replace(/\W+/g,'');//匹配全部非單詞的字符,替換爲空字符串 12 newStr= newStr.replace(/\_+/g,'');//匹配全部下劃線,替換爲空字符串 13 newStr=newStr.toLowerCase(); 14 //轉化字符串爲小寫 15 var arr1= newStr.split(''); 16 ; 17 var arr2=arr1.reverse(); 18 19 var newStr2=arr2.join(''); 20 //重構倒序的字符串 21 22 if(newStr==newStr2){//比較1 23 return true; 24 }else{ 25 return false; 26 } 27 } 28 palindrome("not a palindrome"); 29 30 </script> 31 </body> 32 </html>
分享結束,謝謝你們。