0

zepto のソース コードで、zepto.matches 関数にフォールバック実行があることがわかりました。

zepto.matches = 関数(要素、セレクター) {
    if (!element || element.nodeType !== 1) false を返す
    var matchesSelector = element.webkitMatchesSelector || element.mozMatchesSelector || element.mozMatchesSelector ||
                          element.oMatchesSelector || element.matchesSelector
    if (matchesSelector) return matchesSelector.call(要素, セレクター)
    // セレクターの実行に戻ります:
    変数一致、親 = element.parentNode、一時 = !親
    if (temp) (parent = tempParent).appendChild(要素)
    一致 = ~zepto.qsa(親、セレクター).indexOf(要素)
    temp && tempParent.removeChild(要素)
    リターンマッチ
  }

通常の matchSelector の方法にもかかわらず、フォールバックについて非常に興味があります。なぜこれの前に~を追加するのですか:
~zepto.qsa(parent, selector).indexOf(element)

   document.getElementById("テスト");
   $.zepto.matches(a,"#test") // -1

それは -1 を返します、それは正しいですか、それとも何か不足していますか?

4

1 に答える 1

0

それはビット単位の NOT 演算子です。この場合indexOfindexOfメソッド (配列、文字列) のブール値の戻り値を持つために使用され、一致が見つからない場合は -1 を返し、一致が見つかった場合は位置を返します。もちろん、位置は 0 でもかまいません。したがって、ビットごとの NOT 演算子を使用します。

console.log(~-1); // 0
console.log(~0) // -1
console.log(~1) // -2
// and so on

したがって、JS0では「Falsy」値と見なされ、その他の数値 (例外を除く) は「Truthy」値と見なされるため、要素が見つからない場合は戻り値が返されるため、スレッドに「Falsy」値が含まれる可能性がNaNあり~zepto.qsa(parent, selector).indexOf(element)ます0コード:

var isFound = ~zepto.qsa(parent, selector).indexOf(element);

if (isFound) {
  // do something
}

ただし、その場合、API メソッドであるため、zepto メソッドが実際のブール値を返すことを期待します。このような場合、単純に使用することをお勧めします。

match = zepto.qsa(parent, selector).indexOf(element) > -1;

または

match = !!~zepto.qsa(parent, selector).indexOf(element);

double!は適切なブール表現を持つために使用されます: をindexOf返す場合-1、 で~変換し0、最初!はでtrue、次に で変換します。これfalseは、「見つからない」と予想されるブール値です。

Bitwise NOT は、次のような他のトリックにも使用されます。

var words = ["a", "b", "c", "b", "b"];
var frequency = words.reduce(function(freq, word) {
    freq[word] = -~freq[word];
    return freq;
}, {})

このコードは次のようなオブジェクトを返します{a:1, b:3, c:1}。基本的に、配列内の同じ文字列値の頻度をカウントします。ここで、ビット単位の NOT it は単項否定演算子と共に使用され、インクリメンタル カウンターを持ちます。つまり、 is の場合 – この単語はまだ「辞書」にないため – の場合freq[word]undefinedis~undefined-1あり、単項否定を使用すると becomes になり1ます。次回は-~1、したがって- -2、そう2です。などに-~2なります3

ビット演算子は非常に便利ですが、悪用されやすくなっています。必要な場合もあります (たとえば、ゼロフィルの右シフトは、現在 JS で の代わりになる唯一の方法ToUint32です)、そうではなく、コードが読みにくくなる可能性があります。

しかし、彼らは間違いなく知られるに値します。

于 2013-04-12T02:41:12.850 に答える