簡短的回答:在source
屬性的值是正則表達式字面/(?:)/
和你new RegExp()
獲取對象不同。在文字的情況下它是/(?:)/
,而在對象的情況下,它是一個空字符串。當您執行/ /
和new RegExp(" ")
時,source
屬性的值是相同的(都是具有一個空格字符的字符串)。
龍回答:如果你看一下Qunit的源代碼,你會看到這段代碼:
"regexp": function (b, a) {
return QUnit.objectType(b) === "regexp" &&
a.source === b.source && // the regex itself
a.global === b.global && // and its modifers (gmi) ...
a.ignoreCase === b.ignoreCase &&
a.multiline === b.multiline;
};
你可以看到源參數是如何使用該代碼的不同(它只是輸出特性每個正則表達式的參數,並將其測試平等)的:
function eq(x, y) {
console.log("x.source:", "'" + x.source + "'", "y.source:", "'" + y.source + "'", "===:", x.source === y.source);
console.log("x.global:", x.global, "y.global:", y.global, "===:", x.global === y.global);
console.log("x.ignoreCase:", x.ignoreCase, "y.ignoreCase:", y.ignoreCase, "===:", x.ignoreCase === y.ignoreCase);
console.log("x.multiline:", x.multiline, "y.multiline:", y.multiline, "===:", x.multiline === y.multiline);
}
當你調用此方法eq(/(?:)/, new RegExp());
,您可以:
x.source: '(?:)' y.source: '' ===: false
x.global: false y.global: false ===: true
x.ignoreCase: false y.ignoreCase: false ===: true
x.multiline: false y.multiline: false ===: true
當你eq(/ /, new RegExp(" "));
叫它鑑於你:
x.source: ' ' y.source: ' ' ===: true
x.global: false y.global: false ===: true
x.ignoreCase: false y.ignoreCase: false ===: true
x.multiline: false y.multiline: false ===: true
感謝。你的解釋非常清楚。 – pimvdb 2011-04-18 20:32:27
@pimvdb不客氣! :) – 2011-04-18 20:34:48