按位非
2024年03月11日
一、认识
~x
操作数被转换为32
位二进制表示(0
和1
), 超过32
位的数字将丢弃其最高有效位,然后按位取反即可
二、规则
-
0
变1
,1
变0
-
按位非运算时,任何数字x的运算结果都是
-(x + 1)
三、语法
3.1 ~x
let x = ~8
console.log(x)
运算过程
公式运算
:~8 = -(8+1) = -9
四、场景
4.1 条件
根据 ~-1=0
作为判断条件
let x=-1;
if(~x){
console.log('x不为-1');
}else{
console.log('x为-1');
}
4.2 取整
转为 Number
类型并向下取整
结果: ~~ value
和Number(value)
结果类似,只不过将结果为NaN
的转为0
而已, 并将数字向下取整
-
对于
Number
: 返回自己const value = 9;
console.log(+value); // 9
console.log(Math.floor(+value)); // 9
console.log(~~value); // 9
console.log(Number(value)); // 9
console.log(Math.floor(Number(value))); // 9
const value = 9.8;
console.log(+value); // 9.8
console.log(Math.floor(+value)); // 9
console.log(~~value); // 9
console.log(Number(value)); // 9.8
console.log(Math.floor(Number(value))); // 9 -
对于
String
: 如果字符串都为有效数字字符串,那么返回数字; 只要有一个不为数字字符,返回0
const value = "32a";
console.log(+value); // NaN
console.log(Math.floor(+value)); // NaN
console.log(~~ value); // 0
console.log(Number(value)); // NaN
console.log(Math.floor(Number(value))); // NaN
const value = "32";
console.log(+value); // 32
console.log(Math.floor(+value)); // 32
console.log(~~ value); // 32
console.log(Number(value)); // 32
console.log(Math.floor(Number(value))); // 32
const value = " 32 ";
console.log(+value); // 32
console.log(Math.floor(+value)); // 32
console.log(~~ value); // 32
console.log(Number(value)); // 32
console.log(Math.floor(Number(value))); // 32 -
对于
BigInt
类型: 抛出TypeError
,以防止意外的强制隐式转换损失精度。 -
对于
Symbol
类型: 抛出TypeError
-
对于
Object
类型: 返回0
const value = {};
console.log(+value); // NaN
console.log(Math.floor(+value)); // NaN
console.log(~~ value); // 0
console.log(Number(value)); // NaN
console.log(Math.floor(Number(value))); // NaN -
对于
Array
类型: 返回0
const value = [];
console.log(+value); // 0
console.log(Math.floor(+value)); // 0
console.log(~~ value); // 0
console.log(Number(value)); // 0
console.log(Math.floor(Number(value))); // 0
const value = [1,2];
console.log(+value); // NaN
console.log(Math.floor(+value)); // NaN
console.log(~~ value); // 0
console.log(Number(value)); // NaN
console.log(Math.floor(Number(value))); // NaN
const value = [1];
console.log(+value); // 1
console.log(Math.floor(+value)); // 1
console.log(~~ value); // 1
console.log(Number(value)); // 1
console.log(Math.floor(Number(value))); // 1