为什么我不能将函数直接传递给 replace 方法?
Why can't I pass the function directly into replace method?
我简直无法理解为什么输出的第二行和第三行不同:
alphabet_ASCII = '';
for (i=65; i<=90; i++) {
alphabet_ASCII += i;
}
alphabet_ASCII += '<br>';
document.body.innerHTML += alphabet_ASCII;
document.body.innerHTML +=
alphabet_ASCII.replace(/\d{2}/g, x=>String.fromCharCode(x));
document.body.innerHTML +=
alphabet_ASCII.replace(/\d{2}/g, String.fromCharCode);
x=>String.fromCharCode(x)
和String.fromCharCode
有什么区别?
因为 String.fromCharCode
接受多个参数,并且 replace
调用回调时使用的不仅仅是您期望的一个参数:它调用回调时使用:
- 所有匹配的文本
- 任何捕获组的内容(如果有)
- 发生此匹配的索引(偏移量)
- 正在作用的整个字符串
所以在你的第二个例子中,String.fromCharCode
比你的第一个例子得到更多的论点,并且尽最大努力处理它们。在第一个回调中,String.fromCharCode
得到 "65", 0, "6566676869707172737475767778798081828384858687888990"
等 returns "A\u0000\u0000"
(因为第二个参数是 0 而第三个无效)。在第二遍中,它得到 "66", 2, "6566676869707172737475767778798081828384858687888990"
和 returns "B\u0002\u0000"
,等等
我简直无法理解为什么输出的第二行和第三行不同:
alphabet_ASCII = '';
for (i=65; i<=90; i++) {
alphabet_ASCII += i;
}
alphabet_ASCII += '<br>';
document.body.innerHTML += alphabet_ASCII;
document.body.innerHTML +=
alphabet_ASCII.replace(/\d{2}/g, x=>String.fromCharCode(x));
document.body.innerHTML +=
alphabet_ASCII.replace(/\d{2}/g, String.fromCharCode);
x=>String.fromCharCode(x)
和String.fromCharCode
有什么区别?
因为 String.fromCharCode
接受多个参数,并且 replace
调用回调时使用的不仅仅是您期望的一个参数:它调用回调时使用:
- 所有匹配的文本
- 任何捕获组的内容(如果有)
- 发生此匹配的索引(偏移量)
- 正在作用的整个字符串
所以在你的第二个例子中,String.fromCharCode
比你的第一个例子得到更多的论点,并且尽最大努力处理它们。在第一个回调中,String.fromCharCode
得到 "65", 0, "6566676869707172737475767778798081828384858687888990"
等 returns "A\u0000\u0000"
(因为第二个参数是 0 而第三个无效)。在第二遍中,它得到 "66", 2, "6566676869707172737475767778798081828384858687888990"
和 returns "B\u0002\u0000"
,等等