Тильда ~ в JavaScript

В JavaScript есть такой редкоприменяемый оператор обозначаемый символом тильда - ~. Вероятно что вы даже не знаете где находится этот символ на клавиатуре, поэтому стоит упомянуть что находится он в английской раскладке в левом верхнем углу сразу под клавишей Esc, на этой клавише также находится буква Ё.

 

Оператор Тильда ~ в JS

Оператор ~ в JavaScript является оператором побитового НЕ .

Если вы редко работаете с бинарными данными, то для вас это мало о чём говорит. Например, цифра 8 выглядит в двоичной системе : 1000. Когда вы используете ~ на этой цифре, она преобразует каждый бит в противоположное значение. То есть, каждая из 1 станет 0 и наоборот. Так ~8 будет равно 7, двоичное представление которого выглядит следующим образом : 0111. Единственная проблема заключается в том, что JavaScript использует то, что называется «Two's Complement», чтобы иметь возможность представлять положительные и отрицательные числа в двоичном формате. Поэтому в джаваскрипте ~7 будет равно -8.

Если вы хотите получить более внятную картину, то вам лучше всего потестировать этот оператор самостоятельно (можно в той же консоле браузера), а так же посмотрите примеры ниже.

 

Примеры использования ~ в javascript

Тильда получила наиболее широкое применение при поиске значения в массиве. Классически оно выглядит так:

if (arr.indexOf(item) >= 0) {
    // item найден в массиве
} else {
    // не найден
}

Эта же логика, но уже с тильдой, принимает более короткий вариант записи:

if (~arr.indexOf(item)) {
    // item найден в массиве
} else {
    // не найден
}

 

Округление вниз

Можно встретить код когда две тильды подрят ~~ используют вместо Math.floor( ) для округления дробных чисел вниз до целого числа:

console.log(~~14.65); // 14
console.log(~~(-21.72); // -21

Но обратите внимание что делает одинарная тильда с дробными числами:

console.log(~14.65); // -15
console.log(~(-14.65)); // -13

Поэтому прежде чем применять тильду, нужно быть уверенным и понимать что вы делаете.

 

Преобразования строки в число

Всем известно, что в javascript число + строка в результате вернёт строку:

console.log(2 + '3'); // вернёт '23'

Поэтому в JavaScript, чтобы приобразовать строку к числу, применяют унарный плюс:

console.log(2 + +'3'); // вернёт 5

Эту же операцию можно произвести поставив две тильды ~~

console.log(2 + ~~'3'); // вернёт 5

Но не стоит неосознанно тыкать тильды в код и забывать, что при преобразовании строки к числу при помощи тильд происходит также округление:

console.log(5 + ~~'3.25'); // → 8
Комментарии 1
Sergey
Sergey
14:16 25.12.2020 #

Не только, но и ~~undefined === 0

function add (a, b) {
  var res = '', c = 0
  a = a.split('')
  b = b.split('')
  while (a.length || b.length || c) {
    c += ~~a.pop() + ~~b.pop()
    res = c % 10 + res
    c = c > 9
  }
  return res
}
add('63829983432984289347293874', '90938498237058927340892374089')

Здесь две тильды заменяет (parseInt(a.pop()) || 0). Круто, на мой взгляд.

*** чтобы писать комментарии.