似乎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)
答案 0 :(得分:2)
|是javascript中的Bitwise Or运算符。 Bitwise Or运算符在每个位位置返回一个位,其中一个或两个操作数的相应位为1。 x | 0是x,对于任何x
bitwise运算符仅适用于整数,因此javascript将float转换为整数。 因此1.5 | 0变为1.
您的表达式可以重写为
1 + (Math.random() * 100 | 0)
190 + (Math.random() * 66 | 0)
答案 1 :(得分:0)
|是一个按位OR运算符。它在每个位的位置返回一个,其中一个或两个操作数的相应位是1。
您可以轻松地将方法更改为以下内容:
1 + Math.random()*100|0
190 + Math.random()*66|0
答案 2 :(得分: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位整数。 “