个性化阅读
专注于IT技术分析

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 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()函数的替代品, 因为双按位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; // -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。


尽管有些开发人员不喜欢这一点, 但我们不同意这一点。你应该抱怨的是, 如何抱怨代码的工作原理, 而无需抱怨什么。在代码中也存在称为”注释”的内容, 以帮助阅读。

赞(0)
未经允许不得转载:srcmini » JavaScript按位NOT,〜运算符

评论 抢沙发

评论前必须登录!