JS中的">>>"操作符是什么?

30

可能是重复问题:
javascript >>> operator?
JavaScript triple greater than

在这行代码中找到了这个运算符:

var t = Object(this),
        len = t.length >>> 0;

这个操作符是什么意思?

下面是完整的代码。这是JS some 方法的代码:

if (!Array.prototype.some) {
  Array.prototype.some = function(fun /*, thisp */) {
    "use strict";

    if (this == null) throw new TypeError();

    var t = Object(this),
        len = t.length >>> 0;

    if (typeof fun != "function") throw new TypeError();

    var thisp = arguments[1];

    for (var i = 0; i < len; i++) {
      if (i in t && fun.call(thisp, t[i], i, t))
        return true;
    }

    return false;
  };
}

4
请查看:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators#.3E.3E.3E_.EF.BC.88Zero-fill_right_shift.EF.BC.89 - Felix Kling
Google是你的朋友。https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators - JB Nizet
4
谢谢您的提醒。但是,谷歌搜索“什么是操作符 >>>”并没有显示任何结果。这个网站也是如此。它们都显示“无结果”。我会尽力帮助您寻找更多信息。 - Green
2个回答

49

>>> 是一个不带符号扩展的右移运算符。

如果你在一个负数上使用 >> 运算符,结果也将是负数,因为原始标志位被复制到所有新位中。而使用 >>> 运算符,则会复制零。

在这种情况下,它只是用作一种限制 length 字段为无符号 31 位整数的方式,换句话说,将 Javascript 的本机 IEEE754 "double" 数字强制转换为整数。


1
是的,关闭这个问题真是太遗憾了 - 为什么在这里使用这个特定的运算符的上下文比其通用用法的细节更重要。 - Alnitak
值得一提的是,在 有符号右移 运算符中并没有什么特别的。每当在 ECMAScript 中应用 位运算符 时,值都会转换为它们的 32 位版本。因此,在这里使用 ~~t.length 也会产生相同的结果。 - jAndy
@jAndy 实际上不会 - ~~n 对于负输入仍然产生负结果。 - Alnitak
@Alnitak:你说得对。不管怎样,如果由于某些原因负数被转换为 >>> 0,那么结果将是一个非常大的数字。这是期望的吗?然而,我上面的陈述仍适用于 32位转换 - jAndy
-1 >>> 0 给出 4294967295,对于后续迭代来说这不是很糟糕吗?(就像 OP 的脚本中的 ; i < len; i++ - CodeManX

5

这是一个零填充右移。当你对一个数字进行位移时,可以选择用零或符号位来填充最左边的位。

在二进制补码表示法中,负数的最高位为1,而正数的最高位为0。因此,如果你不进行“符号扩展”(而是填充零),并且对一个负数进行位移,将会得到一个正数。


阅读了解释后,我仍然有点困惑,因为我没有接触过位运算的场景。换句话说,在代码示例中,这样做是为了“防止”负数吗?我在你的最后一句话中迷失了。谢谢。 - jamie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接