String.prototype.split()
String.prototype.split()方法通過傳入的參數符号,将一個字元串對象分割成一個字元串數組,這個傳入的參數符号決定着字元串在什麼位置進行分割。
var str = 'The quick brown fox jumps over the lazy dog.';
var words = str.split(' ');
console.log(words[3]);
// 輸出: "fox"
var chars = str.split('');
console.log(chars[8]);
// 輸出: "k"
var strCopy = str.split();
console.log(strCopy);
// 輸出數組: ["The quick brown fox jumps over the lazy dog."]
文法
str.split([separator[, limit]])
注意!
如果調用split()函數時傳入了空字元串str.split(“”),此時隻能對屬于UTF-16字元編碼内的字元串進行分割成單字元,而如果字元串中有UTF-16以外的字元,例如unicode字元或一些生僻字,則不能正确分割字元。若需要分割unicode字元,需要使用正規表達式。
"hello".split(""); //["h", "e", "l", "l", "o"] “????” .split(""); // ["�", "�", "�", "�", "�", "�", "�", "�"] //因為部分unicode字元在js中用兩個字碼表示 "????".split(/(?=.)/us); //["?", "?", "?", "?"] //?=表示“向前查找”或“先行斷言”。 //us是ES6新增的正則修飾符,u-支援unicode字碼,s-代表.可以比對任意字元包括換行
參數
separator | 可選
該參數指定字元串在什麼地方進行分割。separator參數可以是一個字元串或者一個正規表達式。如果separator是一個字元串,那在分割時必須完全比對separator字元串才執行分割。如果separator參數沒有傳或者separator參數沒有在被調用的字元串中比對到,傳回值将是一個包含整個被調用字元串的數組。如果separator參數是空字元串,split()函數将會把被調用字元串分割成一個個字元組成的數組。
limit | 可選
limit參數是一個整數,他決定了split()函數的分割次數。如果limit參數存在,傳回的數組的數組長度将小于等于limit。如果在分割時還有未分割完的字元串,但是數組長度已經到達了limit的值,那麼剩餘的字元串将被丢棄,不會在結果中傳回。
傳回值
被調用的字元串每一次出現分割符的地方會被分割,最終拼成一個字元串數組傳回。
描述
函數執行時,被調用字元串會把和separator參數相同的部分移除,并将移除部分前後的子字元串作為數組傳回。如果separator參數沒傳(undefined)或者沒有比對到,傳回的數組中就會包含一個整個被調用的字元串。如果separator是一個空字元串,被調用的字元串就會被分割成一個個字元組成的數組。如果separator在被調用字元串的頭部、尾部或者頭部和尾部都被比對到了,那麼傳回的數組會在頭部、尾部或者頭部和尾部填充一個空字元串。如果separator等同于整個被調用的字元串,傳回數組中會包含兩個空字元串。
如果separator是一個包含捕獲組的正規表達式,那麼當每次比對到separator時,其中的捕獲組會被額外填充到傳回數組中傳回,也就是說捕獲組不會被移除,而是作為單獨的數組一項傳回。
注意!
- 如果separator傳入了一個數組,這個數組會被強制轉換成字元串,執行String(separator)。
- 如果被調用的字元串是一個空字元串,但是separator不是空字元串,split()函數會傳回一個包含一個空字元串的數組;如果被調用的字元串和separator都是空字元串,split()函數會傳回一個空數組。
示例
使用String.prototype.split()函數
下面的示例程式展示了split()函數的正常用法,在splitString中列印出了調用時的相關資訊:
function splitString(stringToSplit, separator) {
var arrayOfStrings = stringToSplit.split(separator);
console.log('The original string is: "' + stringToSplit + '"');
console.log('The separator is: "' + separator + '"');
console.log('The array has ' + arrayOfStrings.length + ' elements: ' + arrayOfStrings.join(' / '));
}
var tempestString = 'Oh brave new world that has such people in it.';
var monthString = 'Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec';
var space = ' ';
var comma = ',';
splitString(tempestString, space);
splitString(tempestString);
splitString(monthString, comma);
程式輸出如下:
The original string is: "Oh brave new world that has such people in it."
The separator is: " "
The array has 10 elements: Oh / brave / new / world / that / has / such / people / in / it.
The original string is: "Oh brave new world that has such people in it."
The separator is: "undefined"
The array has 1 elements: Oh brave new world that has such people in it.
The original string is: "Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec"
The separator is: ","
The array has 12 elements: Jan / Feb / Mar / Apr / May / Jun / Jul / Aug / Sep / Oct / Nov / Dec
從一個字元串中移除空格
下面的例子中,split()函數将比對出一個正規表達式:以任意個空格開始,随後跟一個分号或一個字元串結尾,再跟随一個任意空格。當找到這個比對項後,移除整個比對項:
var names = 'Harry Trump ;Fred Barney; Helen Rigby ; Bill Abel ;Chris Hand ';
console.log(names);
var re = /\s*(?:;|$)\s*/;
var nameList = names.split(re);
console.log(nameList);
對正規表達式進行分析,\s*表示任意個空格;(?:;| ) 是 一 個 捕 獲 組 , 但 是 ? : 表 示 非 獲 取 , 因 此 這 個 捕 獲 組 最 終 會 被 移 除 。 捕 獲 組 中 ; ∣ )是一個捕獲組,但是?:表示非擷取,是以這個捕獲組最終會被移除。捕獲組中;| )是一個捕獲組,但是?:表示非擷取,是以這個捕獲組最終會被移除。捕獲組中;∣表示一個分号或一個字元串結尾。最終程式輸出如下:
Harry Trump ;Fred Barney; Helen Rigby ; Bill Abel ;Chris Hand
[ "Harry Trump", "Fred Barney", "Helen Rigby", "Bill Abel", "Chris Hand", "" ]
傳回一個限制長度的結果
下面的例子中,在split()函數中傳入3作為limit參數:
var myString = 'Hello World. How are you doing?';
var splits = myString.split(' ', 3);
console.log(splits);
最終輸出如下:
["Hello", "World.", "How"]
使用正規表達式的捕獲組功能,來儲存部分分割符内容
如果separator是一個正規表達式,并且包含捕獲組,那麼這個捕獲組會在結果中被傳回:
var myString = 'Hello 1 word. Sentence number 2.';
var splits = myString.split(/(\d)/);
console.log(splits);
正規表達式中的捕獲組将作為單獨的一項數組項在傳回值中出現:
[ "Hello ", "1", " word. Sentence number ", "2", "." ]
傳入一個數組來分割
如果separator是一個數組,那麼split()函數内部會先執行String(separator)将他轉化為一個字元串:
var myString = 'this|is|a|Test';
var splits = myString.split(['|']);
console.log(splits); //["this", "is", "a", "Test"]
var myString = 'ca,bc,a,bca,bca,bc';
var splits = myString.split(['a','b']);
// myString.split(['a','b']) 等同于執行 myString.split(String(['a','b']))
console.log(splits); //["c", "c,", "c", "c", "c"]
使用split()函數反轉字元串
注意,這種方式并不能在任何情況下都适用,對于unicode字元集就存在問題:
var str = 'asdfghjkl';
var strReverse = str.split('').reverse().join(''); // 'lkjhgfdsa'
// split() 傳回的數組可以正好調用reverse()和join()
var str = 'résumé';
var strReverse = str.split(/(?:)/u).reverse().join('');
// 輸出 "́emuśer"。注意這裡的結果已經和輸入的字元串發生了一些變化
如果想反轉包含Unicode字元集的字元串,還是需要進行字碼檢查再進行反轉,例如esrever這個小插件。