濮阳杆衣贸易有限公司

主頁 > 知識庫 > 瀏覽器中的正則表達(dá)式陷阱說明

瀏覽器中的正則表達(dá)式陷阱說明

熱門標(biāo)簽:浙江營銷外呼系統(tǒng)有哪些 惠安地圖標(biāo)注 淄博市張店區(qū)地圖標(biāo)注 遼寧秒客來電話機(jī)器人 上海銷售電銷機(jī)器人軟件 地圖標(biāo)注店鋪地圖標(biāo)注酒店 自己做的電銷機(jī)器人 哈爾濱公司外呼系統(tǒng)代理 山東外呼系統(tǒng)聯(lián)系方式

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

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

 string str="franky";

string str2="franky";

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

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

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

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

我們再看看哪些情況下哪些瀏覽器做了優(yōu)化

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

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

//這里的結(jié)果就有不同了

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

但是

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

有趣的地方在于 opera9 做了優(yōu)化 而opera10 取消了這種優(yōu)化. 看來至少opera團(tuán)隊認(rèn)為這種優(yōu)化時不恰當(dāng)?shù)?..(變相支持了我的觀點.)

 

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

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

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

不同瀏覽器 輸出結(jié)果的 差異 完全符合上面 是否做優(yōu)化的分類.

即沒有 做優(yōu)化的瀏覽器 一律返回true 而作了優(yōu)化的瀏覽器 則是 true false true false 交替的結(jié)果.

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

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

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

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

這里我們?yōu)榱硕惚芟葳?就要 記得一個約定.  請盡量不要使用 一個正則直接量 在函數(shù)體內(nèi) 或 循環(huán)內(nèi). 如果一定要如此 請使用new RegExp('\d',g);這種.

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

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

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

事實上這樣用是最合理的辦法 .原因是 這里我們只產(chǎn)生一個正則對象 并反復(fù)使用他.. 本質(zhì)上也是為了優(yōu)化。但是我們避開了 瀏覽器自己的優(yōu)化差異 導(dǎo)致的不同結(jié)果.

最后我們發(fā)現(xiàn) 所謂陷阱 發(fā)生主要是 /g使用不當(dāng).無論是 exec 還是test都是如此  如果合理使用/g 無論瀏覽器是否存在變態(tài)的優(yōu)化. 執(zhí)行結(jié)果都將是正確的...唯一的區(qū)別 只在于 做了優(yōu)化的瀏覽器 不需要反復(fù)產(chǎn)生一個 正則對象然后再垃圾回收 再產(chǎn)生一個正則對象....如此反復(fù)而已...

那么我們發(fā)現(xiàn) 遵守上面幾個原則的話 這種問題 也都避免了...

標(biāo)簽:無錫 西安 長沙 重慶 泰州 銅川 宣城 綿陽

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《瀏覽器中的正則表達(dá)式陷阱說明》,本文關(guān)鍵詞  瀏覽器,中的,正則,表達(dá)式,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《瀏覽器中的正則表達(dá)式陷阱說明》相關(guān)的同類信息!
  • 本頁收集關(guān)于瀏覽器中的正則表達(dá)式陷阱說明的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    多伦县| 乐昌市| 襄汾县| 茂名市| 察雅县| 多伦县| 亚东县| 重庆市| 肇州县| 张掖市| 济阳县| 宾川县| 新平| 报价| 扎赉特旗| 都江堰市| 无极县| 阜阳市| 潼关县| 怀柔区| 方山县| 文水县| 准格尔旗| 靖江市| 湛江市| 英德市| 辉县市| 许昌县| 太仆寺旗| 杭锦旗| 谢通门县| 唐河县| 扎赉特旗| 太白县| 常州市| 南京市| 松原市| 柘城县| 区。| 武清区| 五原县|