https://stackoverflow.com/a/15106541/10757573
在此线程中,解决方案使用以下代码:
var randomProperty = function (obj) {
var keys = Object.keys(obj)
return obj[keys[ keys.length * Math.random() << 0]];
};
在答案的评论中,一位用户将按位移位解释为:
它更像是
parseInt(keys.length * Math.random(), 0)
的简写
请问有人可以解释左移0与parseInt的相同之处,或者它一般如何工作?
我正在使用这种语法,并且效果很好,但是我不知道它在做什么。
答案 0 :(得分:1)
选择随机数组元素的惯用法是
array[Math.floor(array.length * Math.random())]
此代码正在使用<< 0
作为Math.floor()
的快捷方式。 keys.length * Math.random()
将是一个浮点数。 <<
运算符要求其操作数为整数,因此它将自动将浮点数转换为整数,并且它会像Math.floor()
一样通过舍入来实现。
答案 1 :(得分:1)
当value << 0
为非整数时,在JavaScript中执行value
具有将value
强制转换为整数的效果。在这种情况下,这是必需的,因为Math.random()
返回一个浮点数,该浮点数不能用作整数索引器(keys
是Array
,因此由整数索引)。>
parseInt( /*string:*/ textValue, /*radix:*/ 0 )
不会将数字转换为“基数0”,而是在radix == 0
时,parseInt
函数会将textValue
解析为基数10,除非textValue
以0x
开头,在这种情况下它将解析为基数16。