這兩天在用Regex搞一個稍微有點複雜的東西,但是不同瀏覽器之間的差異可浪費了我不少的人蔘。
現在我把Regex在五大主流瀏覽器(IE、Firefox、Chrome、Safari、Opera,以目前的版本為準)之間的差異整理一下羅列出來,給大家,也算給我自己做一個備忘。
1、Firefox和Chrome會過度最佳化在迴圈(以及其中內嵌的函數定義)中建立的Regex,似乎它們在假設寫JavaScript的人會把Regex的構建和賦值寫錯地方。 複製代碼 代碼如下:var r;
for(var i = 0; i < 2; i++){
var x = /abc/g;
if(r)
document.write(r == x); // 第二個迴圈時Firefox和Chrome會輸出“true”
else
r = x;
}
2、如果你把一個有可能什麼也不返回的函數作為第二個參數傳遞給replace方法,那麼IE可能會直接刪除匹配的文本(在之前的測試中我總結的是Opera的行為比較獨特,現在看起來似乎是錯誤的結論),而其它瀏覽器則是會將匹配的文本替換成“undefined”。 複製代碼 代碼如下:document.write('123'.replace(/2/, function(){})); // IE會輸出“13”,而其它瀏覽器輸出“1undefined3”
3、如果使用new RegExp的形式建立Regex時使用一個已有的Regex執行個體作為參數,那麼大部分瀏覽器都會建立一個準系統相同,但完全獨立的、全新的Regex執行個體;而Safari則會很乾脆地返回作為參數的那個Regex執行個體。 複製代碼 代碼如下:var r = /1/;
document.write(new RegExp(r) == r); // Safari會輸出“true”,而其它瀏覽器輸出為“false”
4、如果把一個“空”的Regex直接轉化成字串,IE以外的瀏覽器都會得到“/(?:)/”,而IE會得到“//”——但從Regex上直接提取source屬性的時候,得到的都是Null 字元串。 複製代碼 代碼如下:document.write(new RegExp('')); // IE輸出“//”,其它瀏覽器輸出“/(?:)/”
document.write(eval('' + new RegExp(''))) // IE輸出“undefined”,其它瀏覽器輸出“/(?:)/”
5、如果把一個包含斜線“/”的Regex直接轉化成字串——以“new RegExp('/')”為例,只有Firefox和Opera會得到“/\//”,並且直接提取source屬性會得到“\/”;而其它瀏覽器則會得到“///”,且直接提取source屬性會得到“/”。 複製代碼 代碼如下:document.write(new RegExp('/')); // Firefox和Opera輸出“/\//”,其它瀏覽器輸出“///”
document.write(eval('' + new RegExp('/'))) // Firefox和Opera輸出“/\//”,其它瀏覽器輸出“undefined”
6、如果在使用字面運算式來定義一個Regex時,使用了無效的選項標誌(例如“/abc/n”),則Chrome和Safari會完全忽視此無效選項標誌(等同於“/abc/”),而在其它瀏覽器會導致語法錯誤。 複製代碼 代碼如下:document.write(/abc/n); // Chrome和Safari會輸出“/abc/”,其它瀏覽器中產生語法錯誤
7、如果通過構造器來建立Regex時,為其指定選項標誌的(第二個)字串參數中包含了非有效標誌的字元,在Firefox中就會引起一個異常,而其它瀏覽器會將無效的部分忽略。 複製代碼 代碼如下:document.write(new RegExp('1', 'n')); // Firefox中會引起一個異常,提示無效的標誌;而其它瀏覽器會輸出“/1/”
暫時就這些吧,發現新的再補上。
來自:http://www.cnblogs.com/NanaLich