字符串与正则表达式的问题

"1 2 3".replace(/\d/g, parseInt); //1 NaN 3
请教一下各位大佬这个结果是怎么得到的?

阅读 2.4k
2 个回答

调用替换函数的参数是:

匹配的串,captures, 位置, 原始串, named captures

这里没有 capture ,所以参数是 匹配串,位置,原始串。(参见 21.2.5.9RegExp.prototype [ @@replace ] ( string, replaceValue )

parseInt 有两个参数,string, radix 。
radix 为 0 时会被替换为 10;否则,如果 radix 小于 2 或 大于36 ,返回 Nan 。

这里对 parseInt 的三次调用分别是 (第三个参数都被 parseInt 忽略):
parseInt("1", 0, "1 2 3") 十进制解析 “1”,结果 1
parseInt("2", 2, "1 2 3") 二进制解析 “2”,失败 NaN
parseInt("3", 4, "1 2 3") 四进制解析 “3”,结果 3

/**
 * parseInt(string, radix) 实际上这个函数接收两个参数
 * 而replace的回调也有多个项
 * 第一个值为匹配到的完整结果,后面的以此为每一个分组
 * 也许见过 xxx.replace(/(a)(b)(c)/g, '$1-$2-$3') 这样的写法
 * ---------------------------------
 * 而你这个情况实际上翻译出来是下面这样
 */
"1 2 3 4 5 6".replace(/\d/g, (g, $1) => {
    console.log('g', g, $1)
    return parseInt(g, $1)
})

// 如果要达到你目前想要的结果,可以这样写
"1 2 3 4 5 6".replace(/\d/g, g => parseInt(g))
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏