在JavaScript中使用〜的目的是什么?

我正在尝试阅读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

但我仍然不明白这是什么设计。

有人可以解释吗?


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

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

如果在集合中找不到元素,则Array.indexOf()方法返回-1。 正如你已经看到一个按位不在-1上给你零,这相当于false 。 任何可能出现的其他值都等同于true

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


那么..这是一个按位不是,所以你可以在使用位时使用它。

至于实际应用中,当你通常没有发现自己在使用位时,这里有一个小技巧:

 if (~arr.indexOf(val)) doStuff();

 //instead of

 if (arr.indexOf(val) > -1) doStuff();

- 编辑 -

我知道我没有看到你要求一个解释使用~indexOf 。 简单地说, ~-1计算为0 。 当您使用if语句时, 0是一个错误值。 这是编写arr.indexOf(val) > -1的简写方式。

链接地址: http://www.djcxy.com/p/74973.html

上一篇: What is the purpose of using ~ in JavaScript?

下一篇: what does `~` mean in javascript