我正在尝试阅读Zepto.js的源代码。函数matches中有一个我不理解的地方:

zepto.matches = function(element, selector) {
    if (!selector || !element || element.nodeType !== 1) return false
    var matchesSelector = element.webkitMatchesSelector || element.mozMatchesSelector ||
                          element.oMatchesSelector || element.matchesSelector
    if (matchesSelector) return matchesSelector.call(element, selector)
    var match, parent = element.parentNode, temp = !parent
    if (temp) (parent = tempParent).appendChild(element)

    //Here is my question. This line used the `~`
    match = ~zepto.qsa(parent, selector).indexOf(element)
    temp && tempParent.removeChild(element)
    return match
}


函数matches用于确定元素是否与提供的选择器匹配。它应该返回一个布尔值。

zepto.qsa()是Zepto的CSS选择器实现,它使用document.querySelectorAll和其他一些优化方法。

所以。以下代码中~的目的是什么?

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


我知道~表示Bitwise NOT

并且(通过我自己的测试):

~ -1 === 0

~ 0 === -1

~ 1 === -2

但是我仍然不明白这个设计的目的。

有人可以解释吗?

最佳答案

它使用bitwise NOT运算符反转indexOf()函数的结果。

我对zepto.js并不熟悉,但是我可以猜测代码在做什么。首先,它调用zepto.qsa()方法并传递父对象和选择器。该方法必须返回一个数组,因为它随后调用indexOf()来获取元素的索引(我认为这是元素被“匹配”)。

如果在集合中找不到元素,则Array.indexOf()方法将返回-1。如您所见,对-1进行按位NOT运算将得到零,这等效于falseAny other value that could come out would be equivalent to true.


  一般来说,这意味着您可以对indexOf()使用按位NOT来
  获取一个布尔值,该值指示搜索的元素是否存在于
  是否收集。

关于javascript - 在JavaScript中使用〜的目的是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28390381/

10-11 01:54