IE7|8中使用特殊替换模式替换字符串的奇怪行为

Odd behavior replacing string with special replacement patterns in IE7|8

本文关键字:替换 字符串 模式 IE7      更新时间:2023-09-26

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

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

最新铬:

 moo$$$$e moo$$$e
最新Firefox:

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

IE7 | 8:

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

我知道flags参数一点也不像标准,因此Firefox和Chrome在第二种情况下的区别。我很酷

然而,我在IE7|8中看到的情况真的很奇怪(仍然是第二种情况)。我试着玩''x24',逃跑和东西,但我找不到任何方法让这个工作如预期($$代表$)。

我知道这可以很容易地完成split()join(),如:

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

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

测试用例

我重新访问了测试用例,结果如下:

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

$$    // '$$' -> '$', global flag used, every 'Y' -> '$'
$$    // '$$' -> '$', global flag used, every 'Y' -> '$'
$$$$  // '$$' -> '$$', global flag used, every 'Y' -> '$$'
$$$$  // '$$' -> '$$', global flag used, every 'Y' -> '$$'

IE7和ie8

$$    // '$$' -> '$', 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'标志作为String.replace的第三个参数,因为这种方式使用的标志不属于任何标准。

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

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

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

    如果string是第二个参数,则$$转换为$。如果这是一个功能驱动的替换,则不存在这样的转换。