在使用特殊替换模式时,我在IE7 | 8中发现了一个非常奇怪的问题:
'moo$$e'.replace( /\$/g, '$$$$' );
'moo$$e'.replace( '\$', '$$$$', 'g' );
最新Chrome:
moo$$$$e moo$$$e
最新的Firefox:
moo$$$$e moo$$$$e
IE7 | 8:
moo$$$$e moo$$$$$e
我知道flags parameter is nothing like a standard,因此在第二种情况下Firefox和Chrome之间存在差异。 我很酷#/ strong>。
然而,我在IE7 | 8中看到的真的很奇怪(还是第二种情况)。我尝试使用'\x24'
,逃避和填充,但我找不到任何方法让它按预期工作($$
代表$
)。
我知道这可以通过split()
和join()
轻松完成,例如:
'moo$$e'.split( '$' ).join( '$$' );
> "moo$$$$e"
但我真的非常好奇IE的错误。有没有解释?
请参阅live example。
答案 0 :(得分:3)
我重新审视了test case并将结果显示如下:
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' -> '$$'
$$ // '$$' -> '$', global flag used, every 'Y' -> '$'
$$Y // '$$' -> '$$', global flag ignored, first 'Y' -> '$$'
$$Y // '$$' -> '$$', global flag ignored, first 'Y' -> '$$'
$$$$ // '$$' -> '$$', global flag used, every 'Y' -> '$$'
自flags used this way don't belong to any standard以来,Chrome会将'g'
标记忽略为String.replace
的第三个参数。
IE假设$$
是字符串而不是替换控件,在这种情况下忽略全局标志:
'YY'.replace( 'Y', '$$', 'g' );
最简单的解决方案是确保结果总是相同的是使用带有标志(RegExp
)的/foo/flags
对象作为第一个参数,使用字符串或函数作为第二个参数。
如果字符串是第二个参数,$$
会转换为$
。如果这是一个功能驱动的替代品,则没有这样的转换。