无符号按位右移
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 >> 0
和Number(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
、>>> value
和Number(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