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

Hac*_*tly 23 javascript numbers operators

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

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;    
  };
}
Run Code Online (Sandbox Code Playgroud)

我想知道作者在初始长度检查中使用三个大于标志是否常见?

var len = this.length >>> 0

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

Bra*_*ney 24

资料来源: LINK

这是零填充右移位运算符,它将第一个操作数的二进制表示向右移动第二个操作数指定的位数.向右移动的位被丢弃,并且在左侧添加零.使用正数时,您将获得与符号传播右移运算符相同的结果,但负数会丢失其符号变为正数,如下一示例所示(假设'a'为-13)将返回1073741820:

码:

result = a >>> b;
Run Code Online (Sandbox Code Playgroud)

  • @jamietre:最终结果是任何值都将转换为数字.如果无法转换,则数字将为0.此外,任何小数位都将被删除.它类似于`~~ this.length`.所以``123">>> 0`将是`123`,或者`123.45 >>> 0`将是`123`,或者`"某些不可转换的值">>> 0`将是'0`. (20认同)
  • 那么在例子`var len = this.length >>> 0`中使用效果究竟是什么?那似乎无能为力. (5认同)
  • 如果您能推断出请分享!我认为这个问题最有趣的不是位移操作符的作用,而是为什么你可以用零作为操作数来做. (5认同)
  • 我唯一可以假设的是,由于按位运算符通常非常快,因此可以通过这种方式来考虑最佳性能.没有调用函数或执行布尔比较或任何事情的开销. (4认同)

Sal*_*n A 14

>>>零填充右移运算符.的>>> 0是操作者的滥用任何数值表达式转换为"整数"或非数字表达为零.这是它的作用:

该运算符将第一个操作数向右移动指定的位数.向右移位的多余位被丢弃.零位从左侧移入.符号位变为0,因此结果始终为正.

以下是适用于所有按位运算的转换为整数行为的说明:

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

这些语句一起声明expr >>> 0将始终返回正数,如下所示:

  1. expr 为按位运算转换为32位整数
  2. >>> 0 没有效果(没有位移位)
  3. 结果转换为a Number

以下是一些表达式及其结果:

        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
Run Code Online (Sandbox Code Playgroud)

其他有趣的案例:

      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
Run Code Online (Sandbox Code Playgroud)

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


Zir*_*rak 9

>>>(右移位)二进制运算符被简单地移位数的最右边的位的指定的次数,以及填充用零到左侧.

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

例如,4 >>> 1会这样做:

4(10) = 100(2)

4(10) >>> 1(10) = 010(2) = 2(10)
        shift once to the right
Run Code Online (Sandbox Code Playgroud)

其他例子:

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
Run Code Online (Sandbox Code Playgroud)

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

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