Javascript Побитовое НЕ, оператор ~

~ оператор

Этот оператор имеет странный результат при использовании с целыми числами, он преобразует целочисленное значение в - ( X + 1 ) значение.

~2 === -3; //true
~1 === -2; //true
~0 === -1; //true
~-1 === 0; //true
// To explain you
// This is what the operator does to the given number
function bitwiseOperator(value){
var result = Math.floor(value);
// return the negative value of the result + 1;
return - (result+ 1);
}
bitwiseOperator(2) === -3; //true
bitwiseOperator(1) === -2; //true
bitwiseOperator(0) === -1; //true
bitwiseOperator(-1) === 0; //true

Однако есть много разработчиков, которые жалуются на использование этого оператора, поскольку он делает код «менее читабельным», но серьезно …

// A developer gets angry if see this
if (~[1,2,3].indexOf(2)) {
console.log("The array contains 2");
}
// Explanation (if you don't understand ...)
/**
[1,2,3].indexOf(2) returns 1
and using ~ makes that 1 becomes : -2
Therefore -2 is truthy !
Remember : 0 is falsy , that's why this shortcut works as ~-1 == false;
*/
// but they don't get angry writing more
if ([1,2,3].indexOf(2) !== -1) {
console.log("The array contains 2");
}

Сравнение с !== -1 является точным эквивалентом проверки того, что результат не -1 с ~, потому что:

var isNotInArray = ~-1; // 0 == false
var isInArray = ~0;// any index : 0 or 1 or 2 or 3 etc. : -1 == true

Только -1 ложно после тильды, поэтому результат indexOf верен только тогда, когда он! == -1.

~~ оператор

Наиболее практичным способом использования возможностей этого оператора является его использование в качестве замены Math.floor() Функция двойного побитового НЕ выполняет ту же операцию намного быстрее.

~~2 === Math.floor(2); //true, 2
~~2.4 === Math.floor(2); //true, 2
~~3.9 === Math.floor(3); //true, 3

Однако будьте осторожны с отрицательными числами! Как вы можете заметить нежелательные результаты:

var a = ~~-4.5; // -4
var b = Math.floor(-4.5); // -5
var c = Math.ceil(-4.5); // -4
(a == b) // false
(a == c) // true

С отрицательными числами ~~ оператор, а не работать как Math.floorкажется, действует как Math.ceil,

Хотя некоторым разработчикам это не нравится, мы не согласны с этим. Вместо того, чтобы жаловаться на то, как сложно читать какой-то код, вы должны изучить, как он работает, без каких-либо жалоб. Также существует то, что называется «комментарии» в кодах, чтобы помочь с чтением.

Ссылка на основную публикацию
Adblock
detector