JavaScript:如何解释“Math.floor(Math.rrandom)”方法的变体
JavaScript: How to interpret a variation of the `Math.floor(Math.random)` method?
似乎Math.random()*3|0
等同于Math.floor(Math.random() * 3)
,这是我熟悉的版本。虽然我理解后者如何生成整数0、1和2的分步过程没有问题,但前者的结构让我感到困惑。它很可能是更迂回的Math.floor
方法的惯用变体。
是否可以用x|y
风格来表达以下两段代码并产生相同的结果?如果是的话,你能分解一下它是如何工作的吗?
1 + Math.floor(Math.random() * 100) // yielding 1-100 (inclusive)
190 + Math.floor(Math.random() * 66) // yielding 190-255 (inclusive)
|是javascript中的Bitwise Or运算符。逐位或运算符在每个位位置返回一个1,其中一个或两个操作数的对应位都是1。x|0是x,对于任何x
按位运算符仅适用于整数,因此javascript将浮点值转换为整数。因此,1.5|0变为1。
您的表达式可以重写为
1 + (Math.random() * 100 | 0)
190 + (Math.random() * 66 | 0)
|是一个按位OR运算符。它在每个位位置返回一个1,其中一个或两个操作数的对应位都是1。
您可以很容易地将您的方法更改为以下内容:
1 + Math.random()*100|0
190 + Math.random()*66|0
根据EMCAScript规范,当位运算符应用于数字时,它会转换为Int32值。这可以解释这种行为。链接:http://www.ecma-international.org/ecma-262/5.1/#sec-11.10
"乘积A:A@B,其中@是上面乘积中的逐位运算符之一,其评估如下:
设lref是评估A的结果。设lval为GetValue(lref)。设rref是评估B的结果。设rval为GetValue(rref)。设lnum为ToInt32(lval)。设rnum为ToInt32(rval)。返回对lnum和rnum应用逐位运算符@的结果。结果是一个有符号的32位整数。"
相关文章:
- 如何防止Math.max()返回NaN
- Math.min()和Math.max()之间有什么区别?在Javascript中
- JavaScript Vector2d Math
- Math.exp() for bigInt?
- 如何使一个Math.random数组元素比另一个数组元素更有可能被选中
- 为什么Math.pow(1,无穷大)返回NaN
- 对变量使用math.max并显示相应的变量
- JavaScript basis 是 math.pow 函数中的十进制数
- Javascript Math.floor 函数失误或实现之谜
- Math.random不断返回相同的答案
- 为什么math.bignumber()返回一个对象?以及我如何使用它
- JS:如何在使用 Math.random() 时排除一系列值
- Math.min.apply 返回 0 表示空值
- Javascript;使用math.random函数随机执行一个操作
- 为什么Java和Javascript Math.round(-1.5)到-1
- Performance: toFixed() vs. Math.floor(x * 10000)
- Math.round MidPointRounding.AwayFromZero in javascript
- Java脚本中的Math.max函数
- 使用Math.round的奇怪方法结果
- JavaScript:如何解释“Math.floor(Math.rrandom)”方法的变体