3

私はQUnitをいじっていますが、つまずいたことが1つあります。

Chromeでこの簡単なテストを試しました。

deepEqual(new RegExp(), /(?:)/);

開発者コンソールにnew RegExp()戻るので、合格すると思いました。sに対して「ただ」行うことは不可能のようですが、両方の関数/(?:)/は同じものを返し、等しいです。new RegExp() === /(?:)/RegExptoString()

リテラル/非リテラル表記が違いを生むと思いましたが、このテストに合格したため、そうではありません。

deepEqual(new RegExp(" "), / /);

したがって、次のテストから、最初のテストは失敗します。

test("test", function() {
    deepEqual(new RegExp(), /(?:)/); // fail
    deepEqual(new RegExp(" "), / /); // pass
    equal(new RegExp().toString(), /(?:)/.toString()); // pass
});

したがって、誰かが最初のテストが失敗する理由について正しい方向に私を向けることができますか?

4

1 に答える 1

3

簡単な答えsourceプロパティの値は、正規表現リテラル/(?:)/とから取得するオブジェクトで異なりますnew RegExp()。リテラルの/(?:)/場合は、ですが、オブジェクトの場合は空の文字列です。とを実行する/ /new RegExp(" ")sourceプロパティの値は同じになります(どちらも1つのスペース文字を含む文字列です)。

長い答え: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
于 2011-04-18T20:05:30.470 に答える