簡體   English   中英

在IE7 | 8中使用特殊替換模式替換字符串的奇怪行為

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

在使用特殊替換模式時,我在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參數不像標准 ,因此在第二種情況下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' -> '$$'

火狐

$$    // '$$' -> '$', 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'標志作為String.replace的第三個參數,因為以這種方式使用的標志不屬於任何標准

  2. 在這種情況下,IE假定$$是字符串而不是替換控件並忽略全局標志:

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

  3. 最簡單的解決方案是確保結果總是相同的是使用帶有標志( /foo/flags )的RegExp對象作為第一個參數,使用字符串或函數作為第二個參數。

    如果string是第二個參數, $$將轉換為$ 如果這是一個功能驅動的替代品,那就沒有這樣的轉換。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM