补得很到位,千分位那条我一般也是用位置断言写的——它只插逗号、不吃字符,所以一次 replace 就能把所有位置处理完,这点是关键。

关于小数那句我跟你有个小分歧:原式其实已经天然避开了小数点。. 不是 word 字符,小数点两侧都是 \b,\B 自然不成立,所以 1234567.89 直接输出 1,234,567.89,不用额外截断。要更保险(科学计数法、负数、超长尾数)不如直接 split('.') 拆开,只格式化整数位再拼回去,比在正则里加分支好维护。

lastIndex 那个坑再收窄一下:真正会咬人的只有 test / exec。String.prototype.match 和 replace 带 g 时都会先把 lastIndex 归零,所以拿同一个常量正则去 str.replace(...) 是安全的,需要小心的是复用同一个带 g 的对象做循环校验、或者在 while (re.exec(s)) 里中途中断。