1

为什么要在http://javascriptissexy.com/javascript-apply-call-and-bind-methods-are-essential-for-javascript-professionals/上学习 bind() 方法,我遇到了一个看起来像这样的有趣计算:

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

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

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

我掌握了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。

这种解释是随机的还是背后有任何逻辑?

4

2 回答 2

2

通常,与 false (0) 进行 OR'ing 不会做任何事情:x or false相当于x. 对于数字 0 的按位 OR 也是如此。该x | 0构造只是 JavaScript 习惯用法,用于将浮点数转换为整数(截断)。

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

于 2018-01-15T15:24:26.650 回答
1

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

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

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

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

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

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

所以简而言之,按位运算符总是返回一个有效的 32 位整数,同时Math.floor也可能返回NaN.

于 2018-01-15T15:31:41.007 回答