本文概述
〜运算子
与整数一起使用时, 此运算符的结果很奇怪, 它将整数值转换为-(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。
尽管有些开发人员不喜欢这一点, 但我们不同意这一点。你应该抱怨的是, 如何抱怨代码的工作原理, 而无需抱怨什么。在代码中也存在称为”注释”的内容, 以帮助阅读。
评论前必须登录!
注册