2015-02-08 1 views
2

Я пытаюсь прочитать исходный код Zepto.js. И есть место в функции matches, что я не понимаю:Какова цель использования ~ в JavaScript?

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() - это реализация селектора CSS Zepto, которая использует document.querySelectorAll и некоторые другие оптимизирует.

So. Какова цель ~ в следующем коде?

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

Я знаю, что означает ~Bitwise NOT.

И (по моим собственным тестам):

~ -1 === 0

~ 0 === -1

~ 1 === -2

Но я до сих пор не понимаю, что этот дизайн для.

Может кто-нибудь объяснить?

+2

Если вы знаете, что это побитовое НЕ, то в чем проблема? https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators#Bitwise_NOT – j08691

+0

https://stackoverflow.com/questions/654057/where-would-i-use-a- bitwise-operator-in-javascript – lifetimes

+0

http://stackoverflow.com/q/9316612/1331430 –

ответ

3

Использование оператора bitwise NOT для инвертирования результатов функции indexOf().

Я не знаком с zepto.js, но могу догадаться, что делает код. Сначала он вызывает метод zepto.qsa() и передает родительский объект и селектор. Этот метод должен возвращать массив, потому что тогда он вызывает indexOf(), чтобы получить индекс для элемента (который, как я полагаю, является «совпадающим» элементом).

Метод Array.indexOf() возвращает -1, если элемент не найден в коллекции. Поскольку вы уже видели побитовое NOT on -1, вы получаете нуль, что эквивалентно false. Any other value that could come out would be equivalent to true.

В целом это означает, что вы можете использовать побитовое НЕ на indexOf(), чтобы получить логическое значение, указывающее, если элемент искал существует в коллекции или нет.

+0

Спасибо. Я понял теперь. Я только что использовал '~ arr.indexOf (x) == true' в своих собственных тестах. Поэтому я перепутался. –

1

Ну .. это побитовое НЕ, поэтому вы можете использовать его при работе с битами.

Что касается практического применения, когда вы обычно не найти себе работу с битами, вот маленькая хитрость:

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

//instead of 

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

--edit--

Я понимаю, что я не видел вас спросить для объяснения использования ~ с indexOf. Проще говоря, ~-1 оценивает по: 0. Когда вы используете оператор if, 0 является ложным значением. Это сокращенный способ написания arr.indexOf(val) > -1.