JS Bitwise - 为了按位Or(|)操作,Math.random()* 2被解释为0和1的规则是什么?

时间:2018-01-15 15:15:55

标签: javascript bitwise-operators bitwise-or

为什么在http://javascriptissexy.com/javascript-apply-call-and-bind-methods-are-essential-for-javascript-professionals/上学习bind()方法,我遇到了一个有趣的计算,如下所示:

var randomNum = ((Math.random () * 2 | 0) + 1) - 1;

试图了解什么| sign,我遇到了JavaScript Bitwise运算符(https://www.w3schools.com/js/js_bitwise.asp)。

我知道(Math.random () * 2 | 0)是一个按位OR运算。

我认识到Math.random() * 2有时在按位值方面给出0或1的值(例如,0.06218657045669751被解释为1)。我编写了一个要检查的函数,在这种情况下,Math.random() * 2计算的结果被视为0,并将其视为1:

function showNumber() {
  console.log(Math.random() * 2);

  return Math.random() * 2 | 0;
}
showNumber();

结果没有给我任何答案。 因为如果Math.random() * 2给出1.5337258727722651,它也可以解释为1和0.

这种解释是按规则随机还是有任何逻辑?

2 个答案:

答案 0 :(得分:1)

通常,使用false(0)进行OR运算不会执行任何操作:x or false等同于x。对于数字0的按位OR也是如此。x | 0构造只是用于将浮点数转换为整数(截断)的JavaScript惯用语。

因为Math.random() * 2是介于0.0(含)和2.0(不包含)之间的数字,所以以这种方式向下舍入可以得到0或1的50/50。

答案 1 :(得分:1)

@Thomas已经answered为什么会返回0或1的问题。但是,我想强调Math.floor| 0之间的区别(如评论中所述)。

在大多数情况下,这些确实会提供相同的结果,在大多数情况下,Math.floor会更容易阅读和理解,尤其是初学者。

如果您的输入来自用户或数据库,则无法确定输入是否为数字。 Math.floor正确处理字符串值,但对其他类型的值确实有一些奇怪的怪癖。

例如:Math.floor(null)返回0,而Math.floor(undefined)返回NaN。使用按位运算符,在这两种情况下都会返回0

更进一步的是将对象作为输入。 Math.floor({})返回NaN,而a={}; a | 0仍返回0,而{} | 0实际上会抛出一个SyntaxError。

更可信的例子是将NaN作为输入。 Math.floor将返回NaN,按位运算符将返回0

因此,简而言之,按位运算符始终返回有效的32位整数,而Math.floor也可能返回NaN