下面的內(nèi)容摘自某書使用正則表達式字面量和使用 RegExp 構(gòu)造函數(shù)創(chuàng)建的正則表達式不一樣。在 ECMAScript 3 中, 正則表達式字面量始終會共享同一個RegExp實例,而使用構(gòu)造函數(shù)創(chuàng)建的每一個新RegExp實例都是一個新實例。來看下面的例子。var re = null, i;for (i=0; i < 10; i++){ re = /cat/g; re.test("catastrophe");}for (i=0; i < 10; i++){ re = new RegExp("cat", "g"); re.test("catastrophe");}在第一個循環(huán)中,即使是循環(huán)體中指定的,但實際上只為 /cat/ 創(chuàng)建了一個 RegExp 實例。由于實例屬性不會重置,所以在循環(huán)中再次調(diào)用 test() 方法會失敗。這是因為第一次調(diào)用 test() 找到了"cat",但第二次調(diào)用是從索引為 3 的字符(上一次匹配的末尾)開始的,所以就找不到它了。由于會測試到字符串末尾,所以下一次再調(diào)用 test()就又從開頭開始了。第二個循環(huán)使用 RegExp 構(gòu)造函數(shù)在每次循環(huán)中創(chuàng)建正則表達式。因為每次迭代都會創(chuàng)建一個新的 RegExp 實例,所以每次調(diào)用 test()都會返回 true。沒能看懂,我測試了下兩種方式來測試,都是返回了10次 true 啊如果放開ES5標(biāo)準(zhǔn)不說,假如是ES3的話是不是說第一種情況是5次,第二種情況是10次呢?var re = null, b = 0, c = 0, tmp, i;for (i=0; i < 10; i++){ re = /cat/g; tmp = re.test("catastrophe"); console.log(tmp); if(tmp){ b++ ; }}for (i=0; i < 10; i++){ re = new RegExp("cat", "g"); tmp = re.test("catastrophe"); console.log(tmp); if(tmp){ c++; }}console.log(b,c);
JS正則使用正則表達式字面量和使用 RegExp 構(gòu)造函數(shù)創(chuàng)建的正則表達式有什么不一樣?
繁星coding
2019-03-14 18:15:53