[英]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' -> '$$'
$$ // '$$' -> '$', global flag used, every 'Y' -> '$'
$$Y // '$$' -> '$$', global flag ignored, first 'Y' -> '$$'
$$Y // '$$' -> '$$', global flag ignored, first 'Y' -> '$$'
$$$$ // '$$' -> '$$', global flag used, every 'Y' -> '$$'
Chrome忽略'g'
標志作為String.replace
的第三個參數,因為以這種方式使用的標志不屬於任何標准 。
在這種情況下,IE假定$$
是字符串而不是替換控件並忽略全局標志:
'YY'.replace( 'Y', '$$', 'g' );
最簡單的解決方案是確保結果總是相同的是使用帶有標志( /foo/flags
)的RegExp
對象作為第一個參數,使用字符串或函數作為第二個參數。
如果string是第二個參數, $$
將轉換為$
。 如果這是一個功能驅動的替代品,那就沒有這樣的轉換。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.