跳到主要内容

按位非

2024年03月11日
柏拉文
越努力,越幸运

一、认识


~x 操作数被转换为32位二进制表示(01), 超过32位的数字将丢弃其最高有效位,然后按位取反即可

二、规则


  • 0110

  • 按位非运算时,任何数字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 类型并向下取整

结果: ~~ valueNumber(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