一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - 正則表達式 - 正則表達式字面量在ECMAScript5中的變化

正則表達式字面量在ECMAScript5中的變化

2020-08-03 17:40正則之家 正則表達式

也就是說在ECMAScript3規范中,用正則表達式創建的RegExp對象會共享同一個實例,而在ECMAScript5中則是兩個獨立的實例

在《JavaScript語言精粹》的第72頁有這樣一段:

用正則表達式字面量創建的RegExp對象來共享同一個單實例:

復制代碼 代碼如下:


function make_a_matcher( ) {
return /a/gi;
}
var x = make_a_matcher( );
var y = make_a_matcher( );

// 注意:x 和 y 是同一個對象!

x.lastIndex = 10;

document.writeln(y.lastIndex); // 10當你在瀏覽器中運行這段代碼時,你會發現IE6-IE9、FireFox4、Chrome10、Safari5輸出都是0,Firefox 3.6.16輸出是10,原因可以在ECMAScript5規范第24頁和第247頁找到:



A regular expression literal is an input element that is converted to a RegExp object (see 15.10) each time the literal is evaluated. Two regular expression literals in a program evaluate to regular expression objects that never compare as === to each other even if the two literals' contents are identical. A RegExp object may also be created at runtime by new RegExp (see 15.10.4) or calling the RegExp constructor as a function (15.10.3).

7.8.5: Regular expression literals now return a unique object each time the literal is evaluated. This change is detectable by any programs that test the object identity of such literal values or that are sensitive to the shared side effects.

也就是說在ECMAScript3規范中,用正則表達式創建的RegExp對象會共享同一個實例,而在ECMAScript5中則是兩個獨立的實例。《JavaScript語言精粹》出版時ECMAScript5還沒有發布,在這個問題上書和ECMAScript3標準保持了一致。FireFox3.6遵循了ECMAScript3標準,所以結果與書中一致,而最新的Firefox4、Chrome和Safari5都遵循ECMAScript5標準,至于IE6-IE8都沒有很好的遵循ECMAScript3標準,不過在這個問題上反而處理對了。很明顯ECMAScript5的規范更符合開發者的期望,那就是相同的正則表達式字面量創建獨立的RegExp對象會有不同的lastIndex,才方便分別處理。

在ECMAScript5規范的第247頁還有兩條來說明ECMAScript5和ECMAScript3在正則表達式字面量上的改變:

7.8.5: Edition 5 requires early reporting of any possible RegExp constructor errors that would be produced when converting a RegularExpressionLiteral to a RegExp object. Prior to Edition 5 implementations were permitted to defer the reporting of such errors until the actual execution time creation of the object.
7.8.5: In Edition 5 unescaped “/” characters may appear as a CharacterClass in a regular expression literal. In Edition 3 such a character would have been interpreted as the final character of the literal.

第1個是在ECMAScript5中正則表達式字面量轉化為RegExp對象時,任何RegExp構造器的錯誤都會盡早報告,而在之前的規范中是只有對象創建真正執行時才會報錯。

第2個是說在ECMAScript5的正則表達式字面量中,未轉義的正斜杠“/”可以直接用在正則表達式字符類中。而在ECMAScript3中它只能作為正則表達式字面量的開始和結束字符。從IE6-IE9、Firefox3.6-Firefox4.0、Chrome和Safari都可以直接把未轉義的正斜杠“/”用在正則表達式字符類中。如:

復制代碼 代碼如下:


var my_regexp = /([8/5+4]*).{3}/g;
var str = '8/5+4 is what!';

var result = my_regexp.exec(str); // the same in IE6-9,FF3.6-4.0,Chrome,Safari

for(var i = 0,n = result.length; i < n; ++i){
document.writeln(result[i]);
}
result[0] = 8/5+4 is
result[1] = 8/5+4


在《JavaScript語言精粹》第76頁也指明在正則表達式的字符類中使用正斜杠“/”需要轉義,也是基于ECMAScript3規范。由于正則表達式中需要轉義的特殊字符比較多,當心存疑慮時對任何特殊字符都可以使用反斜杠“\”來使其字面化確保安全,不過這個規則不適宜字母和數字。

正則表達式字面量從ECMAScript3到ECMAScript5的改變也蠻符合HTML5設計原理中提到的2條。一條是“一旦遇到沖突,最終用戶優先,其次是作者,其次是實現者,其次標準制定者,最后才是理論上的完滿”,另一條是“支持已有內容”。

最后推薦一下XRegExp,它是一個非常優秀的正則表達式JavaScript庫,兼容多個主流瀏覽器、ECMAScript3和ECMAScript5。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 性一交一无一伦一精一品 | 天天做日日做天天添天天欢公交车 | 国产精品久久久久久久福利院 | 91李宗精品72集在线观看 | 9久re热视频这里只有精品 | 日韩精品国产自在欧美 | 精品国产mmd在线观看 | 精品在线免费播放 | 美女禁区视频无遮挡免费看 | 女同69式互添在线观看免费 | 2018av在线| 精品欧美一区二区在线观看欧美熟 | 午夜一级影院 | 亚洲天堂伦理 | 国产精品不卡高清在线观看 | 韩国美女主播在线 | a在线观看欧美在线观看 | 亚洲剧情在线观看 | 欧美香蕉 | 美人的淫事[纯hh] | 日本高清色视频www 日本高清免费观看 | 国产成人咱精品视频免费网站 | 俄罗斯freeoo性另类 | 亚洲国产精品久久无套麻豆 | 亚洲色图网址 | 久久视频这只精品99re6 | jiizz亚洲护士厕所 | 成年人视频免费在线播放 | 国产精品九九热 | 国产欧美日韩在线播放 | 高人先生免费观看全集 | yy8090韩国日本三理论免费 | 四虎最新永久免费视频 | 我和老丈洗澡同性 | 色悠久久久久综合网小说 | 国产成人综合视频 | 欧美色图日韩 | 色在线看 | 成人私人影院在线观看网址 | 亚洲精品国产自在现线最新 | 欧美成人三级伦在线观看 |