4

在使用特殊替换模式时,我在 IE7|8 中发现了一个非常奇怪的问题:

'moo$$e'.replace( /\$/g, '$$$$' );
'moo$$e'.replace( '\$', '$$$$', 'g' );   

最新的铬:

 moo$$$$e moo$$$e

最新火狐:

 moo$$$$e moo$$$$e

IE7|8:

 moo$$$$e moo$$$$$e

我知道flags 参数与 standard 完全不同,因此在第二种情况下 Firefox 和 Chrome 之间存在差异。我很喜欢它

但是,我在 IE7|8 中看到的内容确实很奇怪(仍然是第二种情况)。我尝试玩'\x24',转义和其他东西,但我找不到任何方法可以按预期工作($$代表$)。

我知道这可以通过以下方式轻松split()完成join()

'moo$$e'.split( '$' ).join( '$$' );
> "moo$$$$e"

但我真的,真的很好奇 IE 有什么问题。有什么解释吗?

请参阅现场示例

4

1 回答 1

3

测试用例

我用结果重新审视了测试用例,如下所示:

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' -> '$$'

结论

  1. Chrome 忽略'g'flag 作为第三个参数,String.replace因为以这种方式使用的标志不属于任何标准

  2. 在这种情况下, IE 假定$$是字符串而不是替换控件并忽略全局标志:

    'YY'.replace( 'Y', '$$', 'g' );

  3. 确保结果始终相同的最简单解决方案是使用RegExp带有标志 ( /foo/flags) 的对象作为第一个参数,使用字符串或函数作为第二个参数。

    如果 string 是第二个参数,则$$转换为$. 如果这是一个功能驱动的替换,那么就没有这样的转换。

于 2013-06-11T10:13:13.293 回答