- split()方法將一個字符串對象的每個字符拆出來,並且將每個字符串當成數組的每個元素
- reverse()方法用來改變數組,將數組中的元素倒個序排列,第一個數組元素成為最后一個,最后一個變成第一個
- join()方法將數組中的所有元素邊接成一個字符串
來看個實例:
1 function reverseString(str) { 2 // 第一步,使用split()方法,返回一個新數組 3 // var splitString = "hello".split(""); 4 5 var splitString = str.split(""); //將字符串拆分 6 7 // 返回一個新數組["h", "e", "l", "l", "o"] 8 9 // 第二步,使用reverse()方法創建一個新數組 10 // var reverseArray = ["h", "e", "l", "l", "o"].reverse(); 11 12 var reverseArray = splitString.reverse(); 13 // 原數組元素順序反轉["o", "l", "l", "e", "h"] 14 15 // 第三步,使用join()方法將數組的每個元素連接在一起,組合成一個新字符串 16 // var joinArray = ["o", "l", "l", "e", "h"].join(""); 17 18 var joinArray = reverseArray.join(""); 19 // "olleh" 20 21 // 第四步,返回一個反轉的新字符串 22 return joinArray; // "olleh" 23 } 24 25 reverseString("hello"); // => olleh
將上面的方法簡化一下,可以寫成這樣:
1 function reverseString(str) { 2 return str.split("").reverse().join(""); 3 } 4 reverseString("hello"); // => olleh
使用一個遞減循環遍歷將字符串反轉
這種方法使用的是一個for
循環給原字符串做一個遞減遍歷,然后將遍歷的字符串重新合並成一個新字符串:
1 function reverseString(str) { 2 // 第一步:創建一個空的字符串用來存儲新創建的字符串 3 4 var newString = ""; 5 6 // 第二步:使用for循環 7 // 循環從str.length-1開始做遞減遍歷,直到 i 大於或等於0,循環將繼續 8 // str.length - 1對應的就是字符串最后一個字符o 9 10 for (var i = str.length - 1; i >= 0; i--) { 11 newString += str[i]; // 或者 newString = newString + str[i]; 12 } 13 14 // 第三步:返回反轉的字符串 15 return newString; 16 } 17 18 reverseString('hello'); // => // "olleh"
簡單的看看字符串遍歷的過程。假設需要將字符串"hello"反轉。其整個遍歷過程如下表所示:
迭代順序 | 對應i 的值 |
新字符串 newString |
---|---|---|
每次迭代 | str.length - 1 | newString + str[i] |
第一次迭代 | 5 - 1 = 4 | "" + "o" = "o" |
第二次迭代 | 4 - 1 = 3 | "o" + "l" = "ol" |
第三次迭代 | 3 - 1 = 2 | "ol" + "l" = "oll" |
第四次迭代 | 2 - 1 = 1 | "oll" + "e" = "olle" |
第五次迭代 | 1 - 1 = 0 | "olle" + "h" = "olleh" |
其實上面的for
循環,也可以換成while
循環:
1 function reverseString (str) { 2 var newString = ''; 3 var i = str.length; 4 5 while (i > 0) { 6 newString += str.substring(i - 1, i); 7 i--; 8 } 9 10 return newString; 11 } 12 13 reverseString("hello"); // => olleh
在while
循環中substring()
方法。substring()
返回字符串兩個索引之間(或到字符串末尾)的子串。
使用遞歸實現字符串反向
使用String.prototype.substr()
和String.prototype.charAt()
方法也可以將一個字符串反向。
substr()
方法返回字符串中從指定位置開始到指定長度的子字符串。比如:
1 var str = "abcdefghij"; 2 3 console.log("(1,2): " + str.substr(1,2)); // (1,2): bc 4 console.log("(-3,2): " + str.substr(-3,2)); // (-3,2): hi 5 console.log("(-3): " + str.substr(-3)); // (-3): hij 6 console.log("(1): " + str.substr(1)); // (1): bcdefghij 7 console.log("(-20, 2): " + str.substr(-20,2)); // (-20, 2): ab 8 console.log("(20, 2): " + str.substr(20,2)); // (20, 2):
charAt()
方法返回字符串中指定位置的字符。字符串中的字符從左向右索引,第一個字符的索引值為 0
,最后一個字符(假設該字符位於字符串 stringName
中)的索引值為 stringName.length - 1
。 如果指定的 index
值超出了該范圍,則返回一個空字符串。
1 var anyString = "Brave new world"; 2 console.log("The character at index 0 is '" + anyString.charAt(0) + "'"); // =>The character at index 0 is 'B' 3 console.log("The character at index 1 is '" + anyString.charAt(1) + "'"); // =>The character at index 1 is 'r' 4 console.log("The character at index 2 is '" + anyString.charAt(2) + "'"); // =>The character at index 2 is 'a' 5 console.log("The character at index 3 is '" + anyString.charAt(3) + "'"); // => The character at index 3 is 'v' 6 console.log("The character at index 4 is '" + anyString.charAt(4) + "'"); // => The character at index 4 is 'e' 7 console.log("The character at index 999 is '" + anyString.charAt(999) + "'"); // => The character at index 999 is ''
結合起來,我們可以這樣做實現字符串反向:
1 function reverseString(str) { 2 if (str === "") { 3 return ""; 4 } else { 5 return reverseString(str.substr(1)) + str.charAt(0); 6 } 7 } 8 reverseString("hello"); // => olleh
第一部分的遞歸方法。你需要記住,你不會只調用一次,你將會有幾個嵌套的調用。
每次調用str === "?" | reverseString(str.subst(1)) | + str.charAt(0) |
---|---|---|
第一次調用 | reverseString("Hello") | reverseString("ello") + "h" |
第二次調用 | reverseString("ello") | reverseString("llo") + "e" |
第三次調用 | reverseString("llo") | reverseString("lo") + "l" |
第四次調用 | reverseString("lo") | reverseString("o") + "l" |
第五次調用 | reverseString("o") | reverseString("") + "o" |
第二部分的遞歸方法。
每次調用 | 返回 |
---|---|
第五次調用 | reverseString("") + "o" = "o" |
第四次調用 | reverseString("o") + "l" = "o" + "l" |
第三次調用 | reverseString("lo") + "l" = "o" + "l" + "l" |
第二次調用 | reverserString("llo") + "e" = "o" + "l" + "l" + "e" |
第一次調用 | reverserString("ello") + "h" = "o" + "l" + "l" + "e" + "h" |
上面的方法還可以繼續改良一下,改成三元操作符:
1 function reverseString(str) { 2 return (str === '') ? '' : reverseString(str.substr(1)) + str.charAt(0); 3 } 4 reverseString("hello"); // => olleh
還可以換成這樣的方式
1 function reverseString(str) { 2 return str && reverseString(str.substr(1)) + str[0]; 3 } 4 reverseString("hello"); // => olleh
除了上面的方法之外,其實還有其他一些方法:
方法一
1 function reverseString (str) { 2 var newString = []; 3 for (var i = str.length - 1, j = 0; i >= 0; i--, j++) { 4 newString[j] = str[i]; 5 } 6 return newString.join(''); 7 } 8 9 reverseString("hello"); // => olleh
方法二
1 function reverseString (str) { 2 for (var i = str.length - 1, newString = ''; i >= 0; newString += str[i--] ) { 3 4 } 5 return newString; 6 } 7 8 reverseString("hello"); // => olleh
方法三
1 function reverseString (str) { 2 function rev(str, len, newString) { 3 return (len === 0) ? newString : rev(str, --len, (newString += str[len])); 4 } 5 return rev(str, str.length, ''); 6 } 7 reverseString("hello"); // =>olleh
方法四
1 function reverseString (str) { 2 str = str.split(''); 3 var len = str.length, 4 halfIndex = Math.floor(len / 2) - 1, 5 newString; 6 for (var i = 0; i <= halfIndex; i++) { 7 newString = str[len - i - 1]; 8 str[len - i - 1] = str[i]; 9 str[i] = newString; 10 } 11 return str.join(''); 12 } 13 reverseString("hello"); // => olleh
方法五
1 function reverseString (str) { 2 if (str.length < 2) { 3 return str; 4 } 5 var halfIndex = Math.ceil(str.length / 2); 6 return reverseString(str.substr(halfIndex)) + reverseString(str.substr(0, halfIndex)); 7 } 8 9 reverseString("hello"); // =>olleh
方法六
1 function reverseString(str) { 2 return [].reduceRight.call(str, function(prev, curr) { 3 return prev + curr; 4 }, ''); 5 } 6 7 reverseString("hello"); // =>olleh
ES6的方法
在ES6中,可以變得更為簡單一些,如:
1 [...str].reverse().join('');
或者:
1 [...str].reduceRight( (prev, curr) => prev + curr );
或者:
1 const reverse = str => str && reverse(str.substr(1)) + str[0];