亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Regex > 正文

瀏覽器中的正則表達式陷阱說明

2020-03-16 21:13:36
字體:
來源:轉載
供稿:網友
js 內置對象 RegExp 我們用的很習慣 也很舒服 但是里面卻有 嚴重的隱患 或者陷阱...原因在于 有些瀏覽器 對正則表達式直接量的優化.
 
 

在本章開始前 我要引入一個例子 來說明這種不徹底的 變態的優化 到底合理還是不合理...

c# 中的 字符串直接量 做的優化 就非常徹底...這種優化我們應該是歡迎的...

 string str="franky";

string str2="franky";

在內存中 只有一份 字符串對象 而str和str2 具備相同的一份引用. 很明顯 這非常合理.

string n = "franky",  n2 = "franky";
Response.Write((Object.ReferenceEquals(n,n2)).ToString());//True.

那么 一些特殊情況下  有些瀏覽器 為正則表達式直接量也做了類似的優化.

alert(//d/==//d/);//所有瀏覽器都是false 這很合理 因為正則表達式直接量 同 [] 數組直接量 {}對象直接量一樣 都是引用類型 

我們再看看哪些情況下哪些瀏覽器做了優化

    function f2() {
        return //d/;
    }

       alert(f2() == f2());

//這里的結果就有不同了

ie6 7 8  opear10 safari4 都返回false  (我虛擬機里safari3壞了沒做測試.如果誰有 幫忙測下告訴我結果.謝謝 我估計safari3 會返回true.原因是 maxthon3用的引擎貌似就是safari3 的) 

但是

firefox 2.0 3.0+ 3.5 3.6  chrome 4 5 opear9  maxthon3 demo版  使用webkit引擎下 都返回true

有趣的地方在于 opera9 做了優化 而opera10 取消了這種優化. 看來至少opera團隊認為這種優化時不恰當的...(變相支持了我的觀點.)

 

看到這里 你也許會奇怪 是不是 bug而不是所謂優化??? 也許是閉包對象 出了什么問題或者 是 函數對象上的某些bug引起的?

那么我們看看下面的例子:

for (var i = 0; i < 10; i++) document.writeln(//d/g.test('' + i));

不同瀏覽器 輸出結果的 差異 完全符合上面 是否做優化的分類.

即沒有 做優化的瀏覽器 一律返回true 而作了優化的瀏覽器 則是 true false true false 交替的結果.

我們這里只是一個 循環 ..js中的循環沒有獨立的作用域 更不會產生閉包對象 那么可以肯定 引起這個怪異問題的 根本原因就是某些瀏覽器自作聰明的優化.

可能大家不太理解 test的結果 差異來自哪里...  答案是 test 同 exec 一樣 如果 直接量后面有/g  .設置了 global全局查找參數 的話 那么 同一個test對象 會記錄上次 匹配字符的索引位置.下次再 匹配時 會從這個位置開始..如果沒有 則 匹配索引<0 下次在此匹配時 就仍然從0位置字符開始.

所以上面這個測試 使用 exec 也是可以的.

那么 這里 如何避免瀏覽器差異呢? 簡單的辦法 去掉/g即可

這里我們為了躲避陷阱 就要 記得一個約定.  請盡量不要使用 一個正則直接量 在函數體內 或 循環內. 如果一定要如此 請使用new RegExp('/d',g);這種.

對于exec 盡量用 string.match代替. 因為match 強制你依靠是否有 /g 來全局查找..不會產生歧義.

對于test 如果是循環內 也可以考慮  var reg=//d/; //這里要吧/g去掉..請不要忘記哦

for (var i = 0; i < 10; i++) document.writeln(reg.test('' + i));

事實上這樣用是最合理的辦法 .原因是 這里我們只產生一個正則對象 并反復使用他.. 本質上也是為了優化。但是我們避開了 瀏覽器自己的優化差異 導致的不同結果.

最后我們發現 所謂陷阱 發生主要是 /g使用不當.無論是 exec 還是test都是如此  如果合理使用/g 無論瀏覽器是否存在變態的優化. 執行結果都將是正確的...唯一的區別 只在于 做了優化的瀏覽器 不需要反復產生一個 正則對象然后再垃圾回收 再產生一個正則對象....如此反復而已...

那么我們發現 遵守上面幾個原則的話 這種問題 也都避免了...


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
爽爽爽爽爽爽爽成人免费观看| 亚洲白拍色综合图区| 亚洲欧美日韩图片| 中文字幕亚洲图片| 欧美日韩激情美女| 色综合伊人色综合网站| 91精品久久久久久久久| 亚洲国内精品视频| 亚洲91精品在线观看| 久久噜噜噜精品国产亚洲综合| 国产精品99蜜臀久久不卡二区| 97在线观看视频国产| 色综合久久天天综线观看| 91精品视频播放| 精品久久久久久久久国产字幕| 亚洲精品国产免费| 亚洲一级一级97网| 日本免费久久高清视频| www.日本久久久久com.| 国产成人av网| 亚洲国产精品久久久久秋霞不卡| 国产欧美日韩精品在线观看| 久久影院模特热| 日韩电影中文字幕av| 欧美性xxxx极品hd欧美风情| 精品久久久在线观看| 亚洲第一福利网| 亚洲精品福利在线| 中文字幕在线观看日韩| 久久综合九色九九| 亚洲丝袜av一区| 91极品女神在线| 欧美在线视频观看| 国产成人久久久| 国产欧美亚洲视频| 久久精品影视伊人网| 亚洲japanese制服美女| 亚洲a中文字幕| 国产一区视频在线播放| 国产成人亚洲综合91精品| 成人精品网站在线观看| 亚洲乱码一区av黑人高潮| 亚洲一区二区三区sesese| 日韩精品视频在线免费观看| 国产精品对白刺激| 日韩综合中文字幕| 色中色综合影院手机版在线观看| 国产98色在线| 亚洲图片在线综合| 国产精品自拍偷拍| 亚洲成人黄色在线| 丝袜美腿精品国产二区| 欧美麻豆久久久久久中文| 在线成人一区二区| 亚洲欧美日韩一区二区在线| 91丨九色丨国产在线| 久久精品久久精品亚洲人| 日韩精品视频免费| 富二代精品短视频| 中文字幕欧美国内| 欧美日韩国产精品专区| 国产成人av网址| 久久久久久久久久亚洲| 亚洲成人激情在线| 91久久精品国产91性色| 91中文字幕一区| 久久夜色精品亚洲噜噜国产mv| 成人网在线视频| 奇米成人av国产一区二区三区| 国内精品国产三级国产在线专| 国产精品一区二区久久精品| 欧美日韩高清区| 欧美极品在线视频| 日韩美女毛茸茸| 欧美日韩久久久久| 国产不卡一区二区在线播放| 国产综合久久久久久| 久久久精品2019中文字幕神马| 日韩亚洲欧美中文高清在线| 中文字幕在线观看日韩| 亚洲欧美在线一区| 成人网址在线观看| 深夜福利日韩在线看| 91免费在线视频网站| 成人福利在线视频| 中文字幕亚洲自拍| 日韩最新av在线| 亚洲免费视频观看| 91国产中文字幕| 在线不卡国产精品| 日本在线观看天堂男亚洲| 亚洲国产成人久久| 最近2019年中文视频免费在线观看| 日本视频久久久| 色777狠狠综合秋免鲁丝| 日韩电视剧在线观看免费网站| 国产福利精品在线| 国产精品丝袜高跟| 亚洲自拍欧美色图| 国产日韩在线视频| 亚洲国产精品小视频| 亚洲精品一区二区在线| 欧美一级淫片播放口| 国产欧美在线播放| 98精品国产高清在线xxxx天堂| 亚洲自拍偷拍第一页| 精品久久久久久久久中文字幕| 欧美成年人在线观看| 亚洲免费小视频| 亚洲天堂av网| 日本不卡视频在线播放| 中文字幕欧美日韩| 国产精品影片在线观看| 色多多国产成人永久免费网站| 成人黄色短视频在线观看| 日韩精品中文在线观看| 国产精品久久久久久亚洲影视| 欧美日本国产在线| 久久久久久成人精品| 一本色道久久综合狠狠躁篇的优点| 成人av番号网| 成人写真视频福利网| 日韩精品极品毛片系列视频| 亚洲一区二区三区久久| 久久在线视频在线| 日韩在线视频线视频免费网站| 午夜欧美不卡精品aaaaa| 亚洲精品欧美极品| 国模私拍一区二区三区| 视频在线一区二区| 欧美裸身视频免费观看| 久久精品一偷一偷国产| 久热精品视频在线观看| 亚洲国内精品视频| 国内精品免费午夜毛片| 午夜精品福利在线观看| 一区二区三区精品99久久| 45www国产精品网站| 亚洲jizzjizz日本少妇| 91综合免费在线| 青青在线视频一区二区三区| 国产精品亚洲第一区| 色综合久综合久久综合久鬼88| 国产精品成人观看视频国产奇米| 亚洲韩国青草视频| 成人福利网站在线观看11| 国产一区二区三区在线播放免费观看| 久久久之久亚州精品露出| 国产精品永久免费| 国产日韩在线免费| 亚洲精品久久7777777| 欧美成人网在线| 俺去亚洲欧洲欧美日韩| 国产一区二区三区18| 国产精品久久99久久| 91精品视频播放| 最新国产成人av网站网址麻豆| 欧美性videos高清精品| 亚洲午夜国产成人av电影男同| 国产成人一区二区在线| 成人精品久久一区二区三区| 热re91久久精品国99热蜜臀| 国产高清视频一区三区| 91香蕉嫩草影院入口|