JavaScript中的双波浪线是什么意思?

按位操作符

按位操作符的 MDN 讲解

按位操作符(Bitwise operators)将其操作数(operands)当作 32 位的比特序列(由 0 和 1 组成),而不是十进制、十六进制或八进制数值。例如,十进制数 9,用二进制表示则为 1001。按位操作符操作数字的二进制形式,但是返回值依然是标准的 JavaScript 数值。

tips:异或 ⊕ 和同或 ⨀ 是反函数(异或是俩不一样为 1,同或就是俩一样为 1)

OR 或,AND 与,XOR 异或,NOR 或非,NAND 与非,XNOR 异或非

它会删除小数点后的所有内容,因为按位运算符会将其操作数隐式转换为带符号的 32 位整数。无论操作数是(浮点)数字还是字符串,这都有效,并且结果是数字。

换句话说:

1
2
3
4
function(x) {
if(x < 0) return Math.ceil(x);
else return Math.floor(x);
}

仅当 x 在-2^31 和 2^31-1 之间。否则,将发生溢出并且数字将“wrap around”。

将函数的字符串参数转换为数字可能被认为是有用的,但是由于存在溢出的可能性,并且不适合与非整数一起使用,因此我不以这种方式使用它,除了“code golf”(即无意义地从程序源代码中修剪字节,以牺牲可读性和健壮性为代价)。我会用+x 或者 Number(x)代替。

取反的取反是什么意思:

例如:-43.2 的二进制数为:

1
-43.2₁₀ = 11111111111111111111111111010101₂

作为有符号(二进制补码)的 32 位二进制数。(JavaScript 忽略小数点后的内容)将这些位取反可以得到:

1
NOT -43₁₀= 00000000000000000000000000101010₂= 42₁₀

再次反转得到:

1
NOT 42₁₀ = 11111111111111111111111111010101₂= -43₁₀

区别Math.floor(-43.2)在于负数四舍五入趋向于零,而不是趋向于负无穷。(等于-44 的 floor 函数始终向下舍入到下一个较小的整数,而不管该数字是正数还是负数。Math.floor(-43.2) //向下取整 -44)


1
2
3
Math.round()       四舍五入
Math.ceil() 向上取整
Math.floor() 向下取整

Math.trunc()

Math.trunc() 方法会将数字的小数部分去掉,只保留整数部分。

Math.trunc() 与 parseInt()比较

1
2
3
4
5
6
console.log(parseInt('13.14g')); //13
console.log(Math.trunc('13.14g')); //NaN
console.log(parseInt(6.022e23)); //6
console.log(Math.trunc(6.022e23)); //6.022e+23
console.log(parseInt(0.0000006)); //6
console.log(Math.trunc(0.0000006)); //0

如果出现连续的超过 6 个及以上连续的 6 个 0 会自动改成科学计数法: 0.00000060 就会变成 6e-7,parseInt(6e-7)结果也就是 6 了 parseInt 函数将其第一个参数转换为字符串,解析它,并返回一个整数或 NaN。如果不是 NaN,返回的值将是作为指定基数中的数字的第一个参数的整数。

Math.trunc()相对于 Math.ceil()和 Math.floor()的优点

在想要去掉小数部分时,对于数值的正负情况不一样时不用分别考虑了。

1
2
x<0?Math.ceil(x):Math.floor(x)  //before
Math.trunc(x) //now

参考:双波浪线参考 math.trunc 参考 1 math.trunc 参考 2

Donate
  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.
  • Copyrights © 2018-2020 Jee
  • Visitors: | Views:

如果您觉得此文章帮助到了您,请作者喝杯咖啡吧~

支付宝
微信