a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁(yè) > 編程 > Regex > 正文

關(guān)于瀏覽器中正則表達(dá)式陷阱的解析

2024-09-07 17:40:07
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

在js內(nèi)置對(duì)象中我們會(huì)經(jīng)常使用正則表達(dá)式,但是你知道我們?cè)谑褂谜齽t表達(dá)式的時(shí)候里面含有嚴(yán)重的陷阱嗎?那么我們現(xiàn)在就去看看關(guān)于瀏覽器中正則表達(dá)式陷阱的解析。

在本章開(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á)式直接量也做了類(lèi)似的優(yōu)化.

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

我們?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)化的分類(lèi).

即沒(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ù) 的話(huà) 那么 同一個(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ù)而已...

以上就是關(guān)于瀏覽器中正則表達(dá)式陷阱的解析,其實(shí)我們可以發(fā)現(xiàn)陷阱主要發(fā)生在 /g使用不當(dāng)?shù)臅r(shí)候,只有我們遵守上面幾個(gè)原則,就可以避免這種問(wèn)題的發(fā)生。

發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 成人国产精品 | 国产精品久久久精品 | 亚洲黄色免费看 | 日本不卡在线播放 | 婷婷精品久久久久久久久久不卡 | 免费黄色网址在线播放 | 黄色电影网站在线观看 | av大片| 国产精品原创av | 国产91一区| 日韩精品一区二区三区在线观看 | 国产一区二区av | 91网站在线看 | 一级篇 | 北条麻妃国产九九九精品小说 | 久久人人爽人人爽 | 欧美蜜桃精品久久久久久 | 视频一区二区在线观看 | 久久精品视 | 久久精品视频免费 | 国产高清精品一区二区三区 | 国产视频久久久久 | 久久69| 亚洲www永久成人夜色 | 在线观看一区 | 欧洲av一区二区 | 欧洲毛片基地 | 日韩久久一区二区 | 色涩色| 国产伊人99 | 日韩欧美在线播放 | 91亚洲在线 | 国内在线精品 | 久草视频在线播放 | 狠狠天天 | 精品少妇一区二区三区日产乱码 | 午夜在线视频免费观看 | 在线日韩电影 | 日本免费黄色 | 国产亚洲一区二区三区在线 | 在线观看成人网 |