为什么在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.
这种解释是按规则随机还是有任何逻辑?
答案 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
。