3

したがって、「CHILD」を事前にフィルタリングする関数は次のとおりです。

function(match){
    if ( match[1] === "nth" ) {
        // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'
        var test = /(-?)(\d*)n((?:\+|-)?\d*)/.exec(
            match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" ||
            !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]);

        // calculate the numbers (first)n+(last) including if they are negative
        match[2] = (test[1] + (test[2] || 1)) - 0;
        match[3] = test[3] - 0;
    }

    // TODO: Move to normal caching system
    match[0] = done++;

    return match;
}

コードはsizzle.js の 442 ~ 458 行から抽出されます。

では、なぜこの行var test = ...は、exec にブール値を入力させているのでしょうか? それとも本当に文字列ですか?

誰かがそれをさらに数行のコードに分割して説明できますか?

4

1 に答える 1

10

ブール論理演算子はオペランドを返すことができますが、必ずしも結果を返すとは限らないexecため、メソッドは文字列を受け取ります。次に例を示します。Boolean

論理 AND演算子 ( )は、最初のオペランドが true の場合、2番目のオペランド&&の値を返します。

true && "foo"; // "foo"

そして、それ自体がfalsyである場合、最初のオペランドの値を返します。

NaN && "anything"; // NaN
0 && "anything";   // 0

論理 OR演算子 ( )は、最初のオペランドがfalsy||の場合、2 番目のオペランドの値を返します。

false || "bar"; // "bar"

そして、それ自体が偽でない場合、最初のオペランドの値を返します。

"foo" || "anything"; // "foo"

偽の値は、、、、、長さゼロの文字列null、そしてもちろんです。undefinedNaN0false

ブール値のコンテキストで評価されるその他のものはすべて true です( に強制されtrueます)。

それでは、式を見てみましょう。

var test = /(-?)(\d*)n((?:\+|-)?\d*)/.exec(
  match[2] === "even" && "2n" ||  // return '2n' if match[2] is 'even'
  match[2] === "odd" && "2n+1" || // return '2n+1' if it's 'odd'
  !/\D/.test(match[2]) && "0n+" + match[2]|| // return '0n+N' if it's a digit(N) 
  match[2]  // otherwise, return the match[2] value
 );
于 2010-03-27T08:25:29.227 に答える