在js中,以前向下取整都是使用Math.floor方法,现在有看到这样的用法:或运算
interval = interval | 0
为什么这样就可以向下取整了,这种用法和Math.floor比较,有什么好处?
在js中,以前向下取整都是使用Math.floor方法,现在有看到这样的用法:或运算
interval = interval | 0
为什么这样就可以向下取整了,这种用法和Math.floor比较,有什么好处?
真实的原因是:js内部的类型自动转换。
js的数值都是以64位
浮点型表示的。当一个数值需要进行位运算
时,js会自动将它转换为32位有符号
整形,并舍弃小数部分。
n|0 ; n>>0 ; //后面的0 仅用于保证n的整数值不变而已。
从64位降到32位,是会有精度损失的。小心!
,最大有效范围: 2^32/2-1
> f64=(Math.pow( 2,32)/2-1)-0.5
2147483646.5
> f64|0
2147483646
> f64>>0
2147483646
> (f64 + 2)|0 //超出有效范围
-2147483648
> (f64 + 2)>>0 //超出有效范围
-2147483648
> Math.floor(f64 + 2) //正确
2147483648
7 回答3.1k 阅读✓ 已解决
12 回答5.2k 阅读✓ 已解决
16 回答5.7k 阅读
9 回答3.4k 阅读
7 回答4k 阅读✓ 已解决
10 回答3.1k 阅读
6 回答2.2k 阅读✓ 已解决
注意,
|
不是逻辑或,而是按位或 (OR)。一些小区别。比如
Math.floor(NaN)
还是返回NaN
。但NaN | 0
返回 0。再比如
Math.floor(Infinity)
返回Infinity
,但Infinity | 0
返回 0