【问题标题】:What does the bitwise shift left accomplish here? [duplicate]向左移位在这里完成了什么? [复制]
【发布时间】:2020-01-13 22:30:07
【问题描述】:

https://stackoverflow.com/a/15106541/10757573

在此线程中,解决方案使用以下代码:

var randomProperty = function (obj) {
    var keys = Object.keys(obj)
    return obj[keys[ keys.length * Math.random() << 0]];
};

在答案的 cmets 中,一位用户将按位移位解释为:

它更像是parseInt(keys.length * Math.random(), 0)的简写


谁能解释一下按位左移 0 是如何与 parseInt 相同的,或者它是如何工作的,好吗?

我正在使用这种语法,它运行良好,但我不明白它在做什么。

【问题讨论】:

  • "我正在使用这种语法,而且效果很好,但是我不明白它在做什么。" 那你怎么知道它工作很好?
  • 另外,parseInt(keys.length * Math.random(), 0) 没有任何意义 - 您将值解析为基数为零?以零为底的任何数字表示为什么?
  • @VLAZ radix: 0 实际上有特殊行为:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…

标签: javascript


【解决方案1】:

value 是非整数时,在JavaScript 中执行value &lt;&lt; 0 具有将value 强制转换为整数的效果。在这种情况下这是必要的,因为Math.random() 返回一个浮点数,它不能用作整数索引器(keys 是一个Array,因此它由整数索引)。

parseInt( /*string:*/ textValue, /*radix:*/ 0 ) 不会将数字转换为“基数 0”,而是当 radix == 0 时,parseInt 函数会将 textValue 解析为基数 10,除非 textValue0x 开头,在这种情况下它将将其解析为基数 16。

【讨论】:

    【解决方案2】:

    选择随机数组元素的常用习语是

    array[Math.floor(array.length * Math.random())]
    

    这段代码的作用是使用&lt;&lt; 0 作为Math.floor() 的快捷方式。 keys.length * Math.random() 将是一个浮点数。 &lt;&lt; 运算符要求其操作数是整数,因此它会自动将该浮点数转换为整数,并且它通过向下舍入来实现这一点,就像 Math.floor() 所做的那样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-08
      • 2016-06-02
      • 2020-09-09
      • 1970-01-01
      • 1970-01-01
      • 2014-06-06
      • 1970-01-01
      • 2012-07-26
      相关资源
      最近更新 更多