Тильда ~ в 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
Не только, но и
~~undefined === 0
Здесь две тильды заменяет
(parseInt(a.pop()) || 0)
. Круто, на мой взгляд.*** Войдите чтобы писать комментарии.