跳到主要内容

无符号按位右移

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

一、认识


expression1 >>> expression2 右移表达式的位,不保留符号。

二、规则


运算符把 expression1 的各个位向右移 expression2 指定的位数。右移后左边空出的位用零来填充。移出右边的位被丢弃。例如:

var temp
temp = -14 >>> 2

变量 temp 的值为 -14 (即二进制的 11111111 11111111 11111111 11110010),向右移两位后等于 1073741820 (即二进制的 00111111 11111111 11111111 11111100)。

三、语法


四、场景


4.1 取整

value >>> 0转为 Number 类型并向下取整

结果: value >> 0Number(value) 结果类似,只不过将结果为NaN的转为0而已, 并将数字向下取整

  • 对于Number: 返回自己

    const value = 9;

    console.log(+value); // 9
    console.log(Math.floor(+value)); //9
    console.log(value >> 0); // 9
    console.log(value >>> 0); // 9
    console.log(Number(value)); // 9
    console.log(Math.floor(Number(value))); //9

    const value = 3.6;

    console.log(+value); // 3.6
    console.log(Math.floor(+value)); //3
    console.log(value >> 0); // 3
    console.log(value >>> 0); // 3
    console.log(Number(value)); // 3.6
    console.log(Math.floor(Number(value))); //3
  • 对于String: 如果字符串都为有效数字字符串,那么返回数字; 只要有一个不为数字字符,返回0

    const value = "32a";

    console.log(+value); // NaN
    console.log(value >> 0); // 0
    console.log(value >>> 0); // 0
    console.log(Number(value)); // NaN

    const value = "32";

    console.log(+value); // 32
    console.log(value >> 0); // 32
    console.log(value >>> 0); // 32
    console.log(Number(value)); // 32

    const value = " 32 ";

    console.log(+value); // 32
    console.log(value >> 0); // 32
    console.log(value >>> 0); // 32
    console.log(Number(value)); // 32
  • 对于BigInt类型: 抛出 TypeError,以防止意外的强制隐式转换损失精度。

  • 对于Symbol类型: 抛出 TypeError

  • 对于Object类型: 返回0

    const value = {};

    console.log(+value); // NaN
    console.log(value >> 0); // 0
    console.log(value >>> 0); // 0
    console.log(Number(value)); // NaN
  • 对于Array类型: 返回0

    const value = [];

    console.log(+value); // 0
    console.log(value >> 0); // 0
    console.log(value >>> 0); // 0
    console.log(Number(value)); // 0

    const value = [1,2];

    console.log(+value); // NaN
    console.log(value >> 0); // 0
    console.log(value >>> 0); // 0
    console.log(Number(value)); // NaN

    const value = [8];

    console.log(+value); // 8
    console.log(value >> 0); // 8
    console.log(value >>> 0); // 8
    console.log(Number(value)); // 8

4.2 除 2 取整

value >>> 1转为 Number 类型除以2并向下取整

结果: 结果同>>value>>> valueNumber(value) 结果类似,只不过将结果为NaN的转为0而已, 并将数字除以2且向下取整

  • 对于Number: 返回自己

    const value = 9;

    console.log(+value); // 9
    console.log(Math.floor(+value / 2)); // 4
    console.log(value >> 1); // 4
    console.log(value >>> 1); // 4
    console.log(Number(value)); // 9
    console.log(Math.floor(Number(value) / 2)); // 4
  • 对于String: 如果字符串都为有效数字字符串,那么返回数字; 只要有一个不为数字字符,返回0

    const value = "32a";

    console.log(+value); // NaN
    console.log(Math.floor(+value / 2)); // NaN
    console.log(value >> 1); // 0
    console.log(value >>> 1); // 0
    console.log(Number(value)); // NaN
    console.log(Math.floor(Number(value) / 2)); // NaN

    const value = "32";

    console.log(+value); // 32
    console.log(Math.floor(+value / 2)); // 16
    console.log(value >> 1); // 16
    console.log(value >>> 1); // 16
    console.log(Number(value)); // 32
    console.log(Math.floor(Number(value) / 2)); // 16

    const value = " 32 ";

    console.log(+value); // 32
    console.log(Math.floor(+value / 2)); // 16
    console.log(value >> 1); // 16
    console.log(value >>> 1); // 16
    console.log(Number(value)); // 32
    console.log(Math.floor(Number(value) / 2)); // 16
  • 对于BigInt类型: 抛出 TypeError,以防止意外的强制隐式转换损失精度。

  • 对于Symbol类型: 抛出 TypeError

  • 对于Object类型: 返回0

    const value = {};

    console.log(+value); // NaN
    console.log(Math.floor(+value / 2)); // NaN
    console.log(value >> 1); // 0
    console.log(value >>> 1); // 0
    console.log(Number(value)); // NaN
    console.log(Math.floor(Number(value) / 2)); // NaN
  • 对于Array类型: 返回0

    const value = [];

    console.log(+value); // 0
    console.log(Math.floor(+value / 2)); // 0
    console.log(value >> 1); // 0
    console.log(value >>> 1); // 0
    console.log(Number(value)); // 0
    console.log(Math.floor(Number(value) / 2)); // 0

    const value = [1,2];

    console.log(+value); // NaN
    console.log(Math.floor(+value / 2)); // NaN
    console.log(value >> 1); // 0
    console.log(value >>> 1); // 0
    console.log(Number(value)); // NaN
    console.log(Math.floor(Number(value) / 2)); // NaN

    const value = [8];

    console.log(+value); // 8
    console.log(Math.floor(+value / 2)); // 4
    console.log(value >> 1); // 4
    console.log(value >>> 1); // 4
    console.log(Number(value)); // 8
    console.log(Math.floor(Number(value) / 2)); // 4