2013-08-19 56 views
4

爲什麼Chrome的控制檯顯示爲/(?:)/ RegExp的原型?Javascript正則表達式原型

console.log(RegExp.prototype); 
console.log(/a/.__proto__); 

這是某些特定實現嗎? IE正在顯示//

這只是一個出於好奇的問題。我試圖在javascript中查看所有正則表達式的原型方法,當時我遇到了這個問題。當然,我發現了其他方法查找這些方法,但這讓我想知道爲什麼會顯示這個結果。

我希望這個問題以前沒有問過 - 在Stackoverflow上沒有找到任何東西。謝謝!

+0

'(?: )'ia空組不匹配:''hello「.replace(/(?: hello)/,」$ 1「); //」$ 1「'while while'」hello「.replace(/(hello )/,「$ 1」); //「hello」' – andlrc

+0

@NULL:'(?:)'是一個非捕獲組 – Toto

回答

6

Relevant section from spec

正則表達式原型對象本身是一個正則表達式對象;它的 [[Class]]是「RegExp」。 RegExp原型 對象的數據屬性(15.10.7)的初始值被設置爲對象是由表達式new RegExp()創建的 ,其中RegExp是具有該名稱的標準 內置構造函數。

Then we go to new RegExp() section,與使用空字符串調用它相同。所以現在我們有空的正則表達式對象作爲原型。

字符串表示is defined to be

返回通過連接字符串「/」所形成的字符串值,此正則表達式對象的源屬性的 字符串值,而「/」; 如果全局屬性爲真則加「g」,如果ignoreCase 屬性爲真則爲「i」,如果多線屬性爲真則爲「m」。

注意返回的字符串的格式爲RegularExpressionLiteral ,該表格的計算結果與另一個與此對象具有相同行爲的另一個RegExp對象爲 。

它最終歸結爲.source屬性(在new RegExp section解釋),作爲正則表達式使用時,只要它的行爲相同的定義實現:

令S是在形成串模式相當於P,其中 某些字符如下所述被轉義。 S可能或可能不是 與P或模式相同;但是,將S作爲模式進行評估所產生的內部過程必須與由構造對象的[[Match]] 內部屬性給出的內部過程相同。

由於new RegExp("(?:)")new RegExp("")表現相同,所以chrome和IE都正確地遵循規範。該規範甚至提到了這個具體的情況爲例:

若P爲空字符串,此規範可以使s 是「(得到滿足?:)」

Chrome的方式可以被認爲是‘好’,因爲它似乎工作的正則表達式字面以及:/(?:)/是一個有效的正則表達式字面而//開始單行註釋

+0

順便說一句,規範中有一個字符串:「如果P是空字符串,可以通過讓S爲「(?:)」來滿足規範*「 –

+0

謝謝,只是完美的答案。我會看看規範,謝謝你的鏈接 - 我已經接受你的答案了你指出我正在尋找什麼。 –

+0

可能值得指出的是,在_JavaScript_語法中,如果你想輸入_RegExp_文字,'//'將不起作用,因爲它將成爲註釋,而'/(?:)/'將起作用,儘管它們都是在_RegExp_方面意​​義相同。 –