奇怪的javascript运算符:expr>>> 0

时间:2011-04-21 16:39:52

标签: javascript numbers operators

以下函数旨在实现IE中的indexOf属性。如果你曾经不得不这样做,我相信你以前见过它。

if (!Array.prototype.indexOf){

  Array.prototype.indexOf = function(elt, from){

    var len = this.length >>> 0;
    var from = Number(arguments[1]) || 0;

    from = (from < 0)
         ? Math.ceil(from)
         : Math.floor(from);

    if (from < 0)
      from += len;

    for (; from < len; from++){
      if (from in this &&    
          this[from] === elt)
        return from;
    }

    return -1;    
  };
}

我想知道作者在初始长度检查中使用了三个大于标志的常见情况吗?

var len = this.length >>> 0

在控制台中执行此操作只会返回我传递给它的对象的长度,而不是true或false,这让我想到了语法的目的。这是一些我不了解的高级JavaScript忍者技术吗?如果是的话,请赐教!

4 个答案:

答案 0 :(得分:23)

来源:LINK

  

这是零填充右移   移动二进制的运算符   表示第一个操作数   权利的数量   由第二个操作数指定。位   向右移动被丢弃   和零添加在左侧。   你会得到一个正数   与结果相同的结果   符号传播右移算子,   但负数却失去了信号   像下一个一样变得积极   例如,(假设'a'为   -13)将返回1073741820:

     

代码:

result = a >>> b;

答案 1 :(得分:12)

>>>Zero-fill right shift运算符。 >>> 0滥用运算符将​​任何数字表达式转换为“整数”或非数字表达式为零。这是它的作用:

  

该运算符将第一个操作数移位指定的位数   正确的。向右移位的多余位被丢弃。零   位从左侧移入。符号位变为0,所以   结果总是积极的。

Here is an explanation转换为整数的行为,适用于所有按位运算:

  

按位运算符将其操作数视为32位序列(零   和1),而不是十进制,十六进制或八进制数。   [...] Bitwise运算符对这种二进制文件执行操作   表示,但它们返回标准的JavaScript数值。

这些陈述一起断言expr >>> 0将始终返回正数,如下所示:

  1. expr被转换为32位整数,用于按位运算
  2. >>> 0没有效果(没有位移位)
  3. 结果转换为Number
  4. 以下是一些表达方式及其结果:

            1 >>> 0 // 1 -- Number cast to 32-bit integer then back to Number
          "1" >>> 0 // 1 -- String cast to 32-bit integer then back to Number
    undefined >>> 0 // 0 -- failed cast yields zero
    

    其他有趣的案例:

          1.1 >>> 0 // 1          -- decimal portion gets it
           -1 >>> 0 // 4294967295 -- -1 = 0xFFFFFFFF
                    //               Number(0xFFFFFFFF) = 4294967295
          "A" >>> 0 // 0          -- cast failed
        "1e2" >>> 0 // 100        -- 1x10^2 is 100
       "1e10" >>> 0 // 1410065408 -- 1x10^10 is 10000000000
                    //               10000000000 is 0x00000002540BE400
                    //               32 bits of that number is 0x540BE400
                    //               Number(0x540BE400) is 1410065408
    

    注意:您会注意到它们都没有返回NaN

答案 2 :(得分:9)

>>>(右移)二元运算符只是将数字的最右边的位移位指定的次数,并用左边的零填充。

注意:在以下示例中,数字后面的数字表示它所在的基数.2表示二进制,10表示十进制。

例如,4 >>> 1可以:

4(10) = 100(2)

4(10) >>> 1(10) = 010(2) = 2(10)
        shift once to the right

其他例子:

4(10) >>> 2(10) = 100(2) >>> 2(10) = 001(2) = 1(10)

10(10) >>> 4(10) = 1010(2) >>> 4(10) = 0000(2) = 0(10)

15(10) >>> 1(10) = 1111(2) >>> 1(10) = 0111(2) = 7

我记得它的方法是向右移动必要的位数,然后写入数字。就像,在最后一个例子中,我只是将所有内容移到右边一次,所以结果是0111。

转移0次没有......没有。不知道为什么会这样。

答案 3 :(得分:2)