什么是JavaScript >>>运算符,您将如何使用它?

2020/11/09 12:22 · javascript ·  · 0评论

我在看Mozilla的代码,该代码向Array添加了一个过滤器方法,并且其中的一行代码使我感到困惑。

var len = this.length >>> 0;

我从未见过>>>在JavaScript中使用过。
这是什么,它做什么?

它不仅将非数字转换为数字,还将其转换为可以表示为32位无符号整数的数字。

虽然JavaScript的数字是双精度浮点(*),位运算符(<<>>&|~)在对32位整数运算的定义。进行按位运算会将数字转换为32位带符号的int,在进行计算然后再转换回Number之前,将丢失所有分数和比32高的位。

因此,进行无实际影响的按位运算(例如,向右移位0位>>0)是舍入数字并确保其在32位int范围内的快速方法。此外,三元>>>运算符在执行无符号运算后,会将其计算结果转换为Number为无符号整数,而不是其他整数,因此可以用于将负数转换为32位二进制补码。版本号很大。使用>>>0确保您拥有0到0xFFFFFFFF之间的整数。

在这种情况下,这很有用,因为ECMAScript用32位无符号整数定义了数组索引。因此,如果您尝试以array.filter与ECMAScript第五版标准完全相同的方式实施,则可以将数字强制转换为32位unsigned int,如下所示。

(在现实中几乎没有实际的需要这是希望的人是不会被设置array.length0.5-11e21'LEMONS'。但是,这是我们正在谈论的JavaScript作家,所以你永远不知道...)

概要:

1>>>0            === 1
-1>>>0           === 0xFFFFFFFF          -1>>0    === -1
1.7>>>0          === 1
0x100000002>>>0  === 2
1e21>>>0         === 0xDEA00000          1e21>>0  === -0x21600000
Infinity>>>0     === 0
NaN>>>0          === 0
null>>>0         === 0
'1'>>>0          === 1
'x'>>>0          === 0
Object>>>0       === 0

(*:嗯,它们被定义为像float一样。出于性能原因,如果某个JavaScript引擎实际上在可能的时候使用了int,这也不会令我感到惊讶。但这将是一个实现细节,您无需花任何精力。的优势。)

Mozilla的所有array extra的方法实现中都使用无符号右移运算符,以确保该length属性是无符号的32位整数

length数组对象属性在规范中描述为:

每个Array对象都有一个length属性,该属性的值始终是小于2 32的非负整数

该运算符是实现此运算符的最短方法,内部数组方法使用该ToUint32操作,但是该方法不可访问,并且出于实现目的而存在于规范中。

Mozilla数组附加实现尝试与ECMAScript 5兼容,请查看Array.prototype.indexOf方法说明(第15.4.4.14节):

1.令O为调用ToObject传递此值的结果 
   作为论点。
2.令lenValue为使用调用O的[[Get]]内部方法的结果 
   参数“长度”。
3.设len为ToUint32(lenValue)
....

如您所见,他们只是想重现该ToUint32方法的行为以使其符合ES3实施中的ES5规范,而且正如我之前所说,无符号右移运算符是最简单的方法。

那是无符号右移运算符。符号与有符号的右移位运算符之间的区别是,无符号的右移位运算符(>>>)从左边开始填充零,而有符号的右移位运算符(>>则由符号位填充,因此移位时保留数值的符号。

Driis已经充分解释了操作员是什么以及它做什么。这是其含义/使用原因:

将方向移动0确实会返回原始数字,并将转换null0似乎您正在查看的示例代码正在使用this.length >>> 0以确保该len数字即使this.length未定义也是如此。

对于许多人来说,按位运算尚不清楚(Douglas Crockford / jslint建议不要使用此类东西)。这并不意味着这样做是错误的,而是存在更有利和熟悉的方法来使代码更具可读性。一种更清晰的方法可以确保len0以下两种方法之一。

// Cast this.length to a number
var len = +this.length;

要么

// Cast this.length to a number, or use 0 if this.length is
// NaN/undefined (evaluates to false)
var len = +this.length || 0; 

>>>无符号右移运算符请参见JavaScript 1.5规范的第76页),而不是>>符号的右移运算符。

>>>更改负数移位的结果,因为它在移位时不保留符号位解释器可以通过示例来理解其后果:

$ 1 >> 0
1
$ 0 >> 0
0
$ -1 >> 0
-1
$ 1 >>> 0
1
$ 0 >>> 0
0
$ -1 >>> 0
4294967295
$(-1 >>> 0).toString(16)
"ffffffff"
$ "cabbage" >>> 0
0

因此,按照"cabbage"上面示例,这里可能要做的是获取长度,或者,如果长度未定义或不是整数,则为0 我认为在这种情况下可以肯定this.length不会< 0尽管如此,我还是认为这个例子很讨厌,原因有二:

  1. 的行为<<<使用负数时,副作用可能不是在上面的例子意图(或可能发生)。

  2. 问题的存在证明了代码的意图并不明显

最佳实践可能是使用更具可读性的内容,除非性能绝对关键:

isNaN(parseInt(foo)) ? 0 : parseInt(foo)

两个原因:

  1. >>>的结果是一个“整数”

  2. 未定义>>> 0 = 0(因为JS会尝试将LFS强制转换为数字上下文,所以它也适用于“ foo” >>> 0,依此类推)

请记住,JS中的数字的内部表示形式为double。这只是基本输入合理性的一种“快速”方式。

但是,-1 >>> 0(糟糕,可能不是所需的长度!)

以下示例Java代码很好地说明了这一点:

int x = 64;

System.out.println("x >>> 3 = "  + (x >>> 3));
System.out.println("x >> 3 = "  + (x >> 3));
System.out.println(Integer.toBinaryString(x >>> 3));
System.out.println(Integer.toBinaryString(x >> 3));

输出如下:

x >>> 3 = 536870904
x >> 3 = -8
11111111111111111111111111000
11111111111111111111111111111000
本文地址:http://javascript.askforanswer.com/shenmeshijavascript-yunsuanfuninjiangruheshiyongta.html
文章标签: ,   ,  
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!