欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2010年05月04日 16:53:04   作者:  
js 內(nèi)置對(duì)象 RegExp 我們用的很習(xí)慣 也很舒服 但是里面卻有 嚴(yán)重的隱患 或者陷阱...原因在于 有些瀏覽器 對(duì)正則表達(dá)式直接量的優(yōu)化.

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

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

 string str="franky";

string str2="franky";

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

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

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

alert(/\d/==/\d/);//所有瀏覽器都是false 這很合理 因?yàn)檎齽t表達(dá)式直接量 同 [] 數(shù)組直接量 {}對(duì)象直接量一樣 都是引用類型 

我們?cè)倏纯茨男┣闆r下哪些瀏覽器做了優(yōu)化

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

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

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

ie6 7 8  opear10 safari4 都返回false  (我虛擬機(jī)里safari3壞了沒(méi)做測(cè)試.如果誰(shuí)有 幫忙測(cè)下告訴我結(jié)果.謝謝 我估計(jì)safari3 會(huì)返回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)化. 看來(lái)至少opera團(tuán)隊(duì)認(rèn)為這種優(yōu)化時(shí)不恰當(dāng)?shù)?..(變相支持了我的觀點(diǎn).)

 

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

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

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

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

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

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

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

所以上面這個(gè)測(cè)試 使用 exec 也是可以的.

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

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

對(duì)于exec 盡量用 string.match代替. 因?yàn)閙atch 強(qiáng)制你依靠是否有 /g 來(lái)全局查找..不會(huì)產(chǎn)生歧義.

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

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

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

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

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

相關(guān)文章

  • 正則表達(dá)式re.sub替換不完整的問(wèn)題及完整解決方案

    正則表達(dá)式re.sub替換不完整的問(wèn)題及完整解決方案

    re.sub是個(gè)正則表達(dá)式方面的函數(shù),用來(lái)實(shí)現(xiàn)通過(guò)正則表達(dá)式,實(shí)現(xiàn)比普通字符串的replace更加強(qiáng)大的替換功能。這篇文章主要介紹了正則表達(dá)式re.sub替換不完整的問(wèn)題及解決方案,需要的朋友可以參考下
    2018-08-08
  • asp.net中匹配URL網(wǎng)址的正則表達(dá)式

    asp.net中匹配URL網(wǎng)址的正則表達(dá)式

    最近在做一些關(guān)于URL匹配的項(xiàng)目,本來(lái)對(duì)正則表達(dá)式了解的不多,上網(wǎng)搜索了好多前輩寫(xiě)的正則表達(dá)式,發(fā)現(xiàn)很少能被我使用的,現(xiàn)將我自己寫(xiě)的正則表達(dá)式貼出來(lái),供大家參考
    2016-10-10
  • 詳解Python3中的正則表達(dá)式的基本用法

    詳解Python3中的正則表達(dá)式的基本用法

    本文重點(diǎn)給大家介紹正則表達(dá)式的相關(guān)用法,正則表達(dá)式是處理字符串的強(qiáng)大的工具,它有自己特定的語(yǔ)法結(jié)構(gòu),有了它,實(shí)現(xiàn)字符串的檢索、替換、匹配驗(yàn)證都不在話下
    2019-07-07
  • 最全最實(shí)用的正則表達(dá)式大全分享

    最全最實(shí)用的正則表達(dá)式大全分享

    正則式太難學(xué),而且容易忘記 。很多不太懂正則的朋友,在遇到需要用正則校驗(yàn)數(shù)據(jù)時(shí),往往是在網(wǎng)上去找很久,結(jié)果找來(lái)的還是不很符合要求。所以我最近把開(kāi)發(fā)中常用的一些正則表達(dá)式整理了一下,在這里分享一下。給自己留個(gè)底,也給朋友們做個(gè)參考。
    2015-10-10
  • 分享一組開(kāi)源的匹配中國(guó)大陸手機(jī)號(hào)碼的正則表達(dá)式

    分享一組開(kāi)源的匹配中國(guó)大陸手機(jī)號(hào)碼的正則表達(dá)式

    這篇文章主要介紹了分享一組開(kāi)源的匹配中國(guó)大陸手機(jī)號(hào)碼的正則表達(dá)式。文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • JavaScript 正則表達(dá)式使用詳細(xì)參數(shù)

    JavaScript 正則表達(dá)式使用詳細(xì)參數(shù)

    正則表達(dá)式(regular expression)對(duì)象包含一個(gè)正則表達(dá)式模式(pattern)。它具有用正則表達(dá)式模式去匹 配或代替一個(gè)串(string)中特定字符(或字符集合)的屬性(properties)和方法(methods)。
    2008-03-03
  • JS正則表達(dá)式一條龍講解(從原理和語(yǔ)法到JS正則)

    JS正則表達(dá)式一條龍講解(從原理和語(yǔ)法到JS正則)

    JS正則表達(dá)式一條龍講解,從原理和語(yǔ)法到JS正則、ES6正則擴(kuò)展,最后再到正則實(shí)踐思路
    2017-04-04
  • ASP正則匹配替換函數(shù)代碼

    ASP正則匹配替換函數(shù)代碼

    這篇文章主要介紹了ASP正則匹配替換函數(shù)代碼,需要的朋友可以參考下
    2023-06-06
  • JavaScript 使用正則表達(dá)式進(jìn)行表單驗(yàn)證的示例代碼

    JavaScript 使用正則表達(dá)式進(jìn)行表單驗(yàn)證的示例代碼

    上篇文章 JavaScript 表單驗(yàn)證正則表達(dá)式大全 說(shuō)的是javascript中使用的正則表達(dá)式的例子,但是沒(méi)有說(shuō)這些正則表達(dá)式如何使用,現(xiàn)在給大家?guī)讉€(gè)例子,大家可以看看。
    2009-08-08
  • PHP正則匹配圖片并給圖片加鏈接詳解

    PHP正則匹配圖片并給圖片加鏈接詳解

    給文章中的圖片添加下一頁(yè)鏈接或點(diǎn)擊打開(kāi)原圖鏈接
    2009-08-08

最新評(píng)論