JavaScript按位NOT,?运算符

本文概述

  • ?运算子
  • ~~运算符
?运算子与整数一起使用时, 此运算符的结果很奇怪, 它将整数值转换为-(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 numberfunction bitwiseOperator(value){    var result = Math.floor(value);     // return the negative value of the result + 1;     return - (result+ 1); }bitwiseOperator(2) === -3; //truebitwiseOperator(1) === -2; //truebitwiseOperator(0) === -1; //truebitwiseOperator(-1) === 0; //true

但是, 有许多开发人员抱怨使用此运算符, 因为它使代码” 可读性差” , 但是严重……
// A developer gets angry if see thisif (~[1, 2, 3].indexOf(2)) {console.log("The array contains 2"); }// Explanation (if you don't understand ...)/**[1, 2, 3].indexOf(2) returns 1and using ~ makes that 1 becomes : -2Therefore -2 is truthy !Remember : 0 is falsy , that's why this shortcut works as ~-1 == false; */// but they don't get angry writing moreif ([1, 2, 3].indexOf(2) !== -1) {console.log("The array contains 2"); }

与!== -1比较完全等同于使用?验证结果是否为-1, 因为:
var isNotInArray = ~-1; // 0 == falsevar isInArray = ~0; // any index : 0 or 1 or 2 or 3 etc. : -1 == true

波浪号后只有-1是虚假的, 因此indexOf结果只有在!== -1时才是真实的。
~~运算符利用此运算符的功能的最实际方法是将其用作Math.floor()函数的替代品, 因为双按位NOT不会更快地执行相同的操作。
~~2 === Math.floor(2); //true, 2~~2.4 === Math.floor(2); //true, 2~~3.9 === Math.floor(3); //true, 3

但是, 请注意负数!你可能会注意到不想要的结果:
var a = ~~-4.5; // -4var b = Math.floor(-4.5); // -5var c = Math.ceil(-4.5); // -4(a == b) // false(a == c) // true

在具有负数的情况下, ~~运算符似乎不像Math.floor那样充当Math.ceil。
【JavaScript按位NOT,?运算符】尽管有些开发人员不喜欢这一点, 但我们不同意这一点。你应该抱怨的是, 如何抱怨代码的工作原理, 而无需抱怨什么。在代码中也存在称为” 注释” 的内容, 以帮助阅读。

    推荐阅读