如今,這裏給出的答案並不完全完整的/正確的。
從ES5開始,文字語法的行爲是一樣的RegExp()
語法關於創建對象:他們兩人創建了一個新的RegExp對象每次代碼路徑擊中它們所參與的表達式。
因此,他們之間的唯一區別,現在是正則表達式多久編譯:
- 用文字語法 - 一次初始代碼解析期間和 編譯
- 隨着
RegExp()
語法 - 每次創建新對象
見,例如,Stoyan Stefanov's JavaScript Patterns書:
正則表達式文字和 構造的另一個區別是,字面期間 分析時創建一個對象只有一次。如果您在循環中創建相同的正則表達式,則會返回之前創建的對象,其所有屬性 (如lastIndex)已經從第一次設置。考慮下面的例子 作爲說明如何返回兩次相同對象 。
function getRE() {
var re = /[a-z]/;
re.foo = "bar";
return re;
}
var reg = getRE(),
re2 = getRE();
console.log(reg === re2); // true
reg.foo = "baz";
console.log(re2.foo); // "baz"
這種行爲在ES5改變,字面也創造了新的對象。該行爲也已在許多瀏覽器環境中得到糾正,因此不會被依賴。
如果您在所有現代瀏覽器或本的NodeJS樣品,你代替得到如下:
false
bar
含義,電子很長的時間,我們在調用getRE()
功能,新RegExp
對象即使使用文字語法方法也會創建。
以上,不僅解釋了爲什麼你不應該使用的RegExp()
爲不可變的正則表達式(它是非常有名的今天的表現的問題),但也說明:
(我更驚訝的是,inlineRegExp和storedRegExp有不同 結果)
的storedRegExp
是約5 - 跨瀏覽器比inlineRegExp
快20%百分比,因爲沒有創建(和垃圾收集)的新對象RegExp
前夕的開銷時間。
結論:
始終創建與文字語法和緩存它一成不變的正則表達式,如果它被重新使用。換句話說,不要依賴ES5之下的envs行爲的差異,並在上面的envs中繼續緩存。
爲什麼字面語法?它具有一定的優勢比較構造函數的語法:
- 它是短,不強迫你覺得在課堂上樣 構造方面。
- 使用
RegExp()
構造函數時,還需要轉義引號和雙重轉義反斜槓。它使正則表達式 難以閱讀和理解其性質更難。
(引自同一Stoyan Stefanov's JavaScript Patterns免費書)。
因此,堅持使用字面語法總是一個好主意,除非編譯時不知道正則表達式。
「內聯」版本更快,因爲它比使用顯式構造函數要難得多。 – Pointy 2012-03-17 13:32:19
其中之一,你可能已經覆蓋'RegExp',所以它必須查找函數,而不是直接評估它,和b)第二個可以在解析時評估,而第一個不能因爲調用'RegExp'可以有如果你已經覆蓋它的副作用。 – pimvdb 2012-03-17 13:36:03