RegExp.prototype[Symbol.split]()
åºçº¿
广æ³å¯ç¨
èª 2020å¹´1æ èµ·ï¼æ¤ç¹æ§å·²å¨ä¸»æµæµè§å¨ä¸å¾å°æ¯æï¼å¯å¨å¤§å¤æ°è®¾å¤åæµè§å¨çæ¬ä¸æ£å¸¸ä½¿ç¨ã
[Symbol.split]() æ¯ RegExp å®ä¾çæ¹æ³ï¼å®æå®äºå½æ£å表达å¼ä½ä¸ºåéç¬¦ä¼ å
¥ String.prototype.split æ¶ï¼å符串åºå¦ä½è¢«åå²ã
å°è¯ä¸ä¸
class RegExp1 extends RegExp {
[Symbol.split](str, limit) {
const result = RegExp.prototype[Symbol.split].call(this, str, limit);
return result.map((x) => `(${x})`);
}
}
console.log("2016-01-02".split(new RegExp1("-")));
// 颿è¾åºï¼Array ["(2016)", "(01)", "(02)"]
console.log("2016-01-02".split(/-/));
// 颿è¾åºï¼Array ["2016", "01", "02"]
è¯æ³
regexp[Symbol.split](str)
regexp[Symbol.split](str, limit)
åæ°
str-
å岿ä½çç®æ ã
limitå¯é-
ä¸ä¸ªæå®è¦æ¥æ¾çå岿¬¡æ°çä¸éçæ´æ°ã
[Symbol.split]()æ¹æ³ä»ç¶ä¼å¯¹thisæ£åè¡¨è¾¾å¼æ¨¡å¼ï¼æä¸è¿°è¯æ³ä¸çregexpï¼çæ¯ä¸ªå¹é 项è¿è¡åå²ï¼ç´å°åå²çå ç´ æ°éè¾¾å°limitéå¶ï¼æè å符串ä¸ä¸åå¹é 该模å¼ã
è¿åå¼
ä¸ä¸ªå
å«åå符串ä½ä¸ºå
ç´ ç Arrayãæè·ç»ä¹ä¼è¢«å
å«å¨å
ã
æè¿°
å½ RegExp ä½ä¸ºåéç¬¦ä¼ å
¥æ¶ï¼String.prototype.split() ä¼å¨å
é¨è°ç¨æ¤æ¹æ³ãä¾å¦ï¼ä¸é¢ç两个示ä¾è¿åç¸åçç»æã
"a-b-c".split(/-/);
/-/[Symbol.split]("a-b-c");
æ¤æ¹æ³ç¨äºå¨èªå®ä¹ RegExp åç±»ä¸ split() æ¹æ³çè¡ä¸ºã
RegExp.prototype[Symbol.split]() åºç¡æ¹æ³å
·æä»¥ä¸è¡ä¸ºï¼
- å®é¦å
使ç¨
[Symbol.species]æé ä¸ä¸ªæ°çæ£å表达å¼ï¼ä»èé¿å 对åå§æ£å表达å¼è¿è¡ä»»ä½ä¿®æ¹ã - 该æ£å表达å¼ç
gï¼âå ¨å±âï¼æ å¿ä¼è¢«å¿½ç¥ï¼èyï¼âç²æ§âï¼æ å¿åå§ç»ä¼è¢«åºç¨ï¼å³ä½¿å®æåå¹¶æªè®¾ç½®ã - å¦æç®æ å符串æ¯ç©ºå符串ï¼ä¸æ£å表达å¼å¯ä»¥å¹é
空å符串ï¼ä¾å¦
/a?/ï¼ï¼åè¿å空æ°ç»ãå¦åï¼å¦ææ£åè¡¨è¾¾å¼æ æ³å¹é 空å符串ï¼åè¿å[""]ã - å¹é
è¿ç¨éè¿ä¸æè°ç¨
this.exec()ãç±äºæ£å表达å¼å§ç»å¸¦æç²æ§æ å¿ï¼æ¯æ¬¡è°ç¨é½ä¼æ²¿å符串å忍è¿ï¼è¿åå¹é çå符串ãå¹é ä½ç½®ç´¢å¼ä»¥å任使è·ç»ã - å¯¹äºæ¯ä¸æ¬¡å¹é ï¼é¦å å°ä¸ä¸ä¸ªå¹é ç»æä½ç½®ä¸å½åå¹é å¼å§ä½ç½®ä¹é´çåå符串添å å°ç»ææ°ç»ä¸ãç¶åï¼å°å½åå¹é ä¸çæè·ç»å¼é个添å è¿å»ã
- 妿å½åå¹é
æ¯ç©ºåç¬¦ä¸²ï¼æè
æ£å表达å¼ï¼ç±äºå¯ç¨äºç²æ§ï¼å¨å½åä½ç½®æ æ³å¹é
ï¼é£ä¹
lastIndexä»ä¼è¢«æ¨è¿ââ妿æ£åæ¯ Unicode æç¥çï¼åæ¨è¿ä¸ä¸ª Unicode ç ä½ï¼å¦åï¼æ¨è¿ä¸ä¸ª UTF-16 ç å ã - 妿æ£åè¡¨è¾¾å¼æ æ³å¹é ç®æ å符串ï¼åè¿ååå§å符串æ¬èº«ï¼å¹¶å°å ¶å 裹å¨ä¸ä¸ªæ°ç»ä¸ã
- è¿åçæ°ç»é¿åº¦ä¸ä¼è¶
è¿æä¾ç
limitåæ°ï¼å¦ææçè¯ï¼ï¼åæ¶ä¼å°½å¯è½æ¥è¿è¯¥éå¶ãå æ¤ï¼å¦ææ°ç»å·²æ»¡ï¼æåä¸ä¸ªå¹é 项åå ¶æè·ç»å¯è½ä¸ä¼å ¨é¨åºç°å¨è¿åçæ°ç»ä¸ã
示ä¾
>ç´æ¥è°ç¨
è¯¥æ¹æ³çç¨æ³å ä¹ä¸ String.prototype.split() ç¸åï¼ä¸åä¹å¤å¨äº this 对象ä¸åä¸åæ°é¡ºåºä¹ææåºå«ã
const re = /-/g;
const str = "2016-01-02";
const result = re[Symbol.split](str);
console.log(result); // ["2016", "01", "02"]
å¨åç±»ä¸ä½¿ç¨ [Symbol.split]()
RegExp çåç±»å¯ä»¥éå [Symbol.split]() æ¹æ³ï¼ä»¥ä¿®æ¹é»è®¤è¡ä¸ºã
class MyRegExp extends RegExp {
[Symbol.split](str, limit) {
const result = RegExp.prototype[Symbol.split].call(this, str, limit);
return result.map((x) => `ï¼${x}ï¼`);
}
}
const re = new MyRegExp("-");
const str = "2016-01-02";
const result = str.split(re); // String.prototype.split ä¼è°ç¨ re[Symbol.split]()ã
console.log(result); // ["ï¼2016ï¼", "ï¼01ï¼", "ï¼02ï¼"]
è§è
| è§è |
|---|
| ECMAScript® 2027 Language Specification> # sec-regexp.prototype-%symbol.split%> |