测试用例
我用结果重新审视了测试用例,如下所示:
var results = [
'YY'.replace( /Y/g, '$$' ),
'YY'.replace( 'Y', '$$', 'g' ),
'YY'.replace( 'Y', function( a, b ) { return '$$'; }, 'g' ),
'YY'.replace( /Y/g, function( a, b ) { return '$$'; })
];
console.log( results.join( '\n' ) );
结果
铬合金
$$ // '$$' -> '$', global flag used, every 'Y' -> '$'
$Y // '$$' -> '$', global flag ignored, first 'Y' -> '$'
$$Y // '$$' -> '$$', global flag ignored, first 'Y' -> '$$'
$$$$ // '$$' -> '$$', global flag used, every 'Y' -> '$$'
火狐
$$ // '$$' -> '$', global flag used, every 'Y' -> '$'
$$ // '$$' -> '$', global flag used, every 'Y' -> '$'
$$$$ // '$$' -> '$$', global flag used, every 'Y' -> '$$'
$$$$ // '$$' -> '$$', global flag used, every 'Y' -> '$$'
IE7 和 8
$$ // '$$' -> '$', global flag used, every 'Y' -> '$'
$$Y // '$$' -> '$$', global flag ignored, first 'Y' -> '$$'
$$Y // '$$' -> '$$', global flag ignored, first 'Y' -> '$$'
$$$$ // '$$' -> '$$', global flag used, every 'Y' -> '$$'
结论
Chrome 忽略'g'
flag 作为第三个参数,String.replace
因为以这种方式使用的标志不属于任何标准。
在这种情况下, IE 假定$$
是字符串而不是替换控件并忽略全局标志:
'YY'.replace( 'Y', '$$', 'g' );
确保结果始终相同的最简单解决方案是使用RegExp
带有标志 ( /foo/flags
) 的对象作为第一个参数,使用字符串或函数作为第二个参数。
如果 string 是第二个参数,则$$
转换为$
. 如果这是一个功能驱动的替换,那么就没有这样的转换。