案例1:用函式回傳結果替換j<*zz
const str = 'z<*zj';
const letters = Array.from(str.replace(/[^a-zA-Z]/gm, ''));
const result = str.replace(/[a-zA-Z]/gm, () => letters.pop());
console.log('result', result); // result => j<*zz/
案例2:沒有函式回傳結果的替換j<*jj
const str = 'z<*zj';
const letters = Array.from(str.replace(/[^a-zA-Z]/gm, ''));
const result = str.replace(/[a-zA-Z]/gm, letters.pop());
console.log('result', result); // result => j<*jj/
因此,它與功能集成不同。背后是什么?需要幫助才能理解。
uj5u.com熱心網友回復:
根據documentation,如果替換引數是 a function,則每次匹配都會呼叫它,并將其回傳值用作替換文本。
因此,case 1當我們replacement作為箭頭函式傳遞時,它會為每個匹配項執行并替換為letters陣列的最后一個元素。當我們使用Array.pop()方法時,它會改變原始陣列的長度并回傳最后一個元素。
例如,
const str = 'z<*zj';
const letters = Array.from(str.replace(/[^a-zA-Z]/gm, ''));
console.log(letters.pop()); // j
console.log(letters); // ["z", "z"]
在這種情況下,在第二次迭代中,它將彈出z并替換為匹配的值。
現在如果說case 2,由于替換引數是 a string,它會一次性替換掉pattern匹配的子串。
例如,
const str = 'z<*zj';
const arr = ['z', 'z', 'j'];
const result = str.replace(/[a-zA-Z]/g, arr.pop());
console.log(result);
uj5u.com熱心網友回復:
存在String.prototype.replace接受函式的多載。此函式將在每場比賽中執行。然后每個匹配letters通過該pop方法發生變異。
當您使用letters.pop()而不是回傳的方法時letters.pop(),它只執行一次,并且每次匹配都會重用其結果。
由于中的最后一個字母letters是j,letters.pop()評估到j并且每個字母都被替換為j。
當使用函式變體時,最后一個字母是j,所以第一個字母被替換為j,但是對于后續匹配,我們現在從一個變異陣列中彈出,所以我們回傳z和 finally z。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/525607.html
