假设题主知道 replace 的常规用法
也知道第二个参数可以是一个函数
也知道正则中的 $1 $2 ... $9 表示捕获组
这个 $0 $1 没有任何实际意义,就是 function 的第一个形参名,第二个形参名
这里用 function(a,b) 代替没有任何区别
参考 MDN 中 replace 的说明
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String/replace第一个参数表示整体匹配字符串,也就是正则中的 $&
第二个参数是第一个捕获组,也就是 $1
这里代码的编写者用 $0 $1 作为变量名,来对应 $& $1
可以理解为一种语义上的强迫症
如果不是 $& 是非法的变量名,他一定会用 function( $& , $1 )
第二个 return 后面是一个映射结构,拆开写就好理解了
var ys = { '我':'me' , '你':'you' };
ys['你'];
// "you"
合起来是这样
{ '我':'me' , '你':'you' }['你']
对于三种被替换的字符 @ ! !,代码编写者希望有三种替换操作
将捕获组输入映射,得到三种对 index 的补全,用来替换三种字符