JavaScript:如何解释“Math.floor(Math.rrandom)”方法的变体

JavaScript: How to interpret a variation of the `Math.floor(Math.random)` method?

本文关键字:Math rrandom floor 方法 何解释 解释 JavaScript      更新时间:2023-09-26

似乎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位整数。"