2

我知道这很愚蠢,但无论如何我在这里遇到了这段代码。

var total = 0;
for (var i = 0; i < someArray.length; i++) {
   total += someArray[i] << 0;
}

这是获取数组值的总和。但我不明白最后一行。

total += someArray[i] << 0;
               //-----^^--here

什么<<意思?这段时间我是不是错过了什么。是的!!为什么<<

4

3 回答 3

7

下一个问题是“为什么 << 0”?

JavaScript 中的所有按位/位移运算符[ToInt32]都调用两个参数。

因此,x << 0(在本例中)、x | 0~~x具有将值强制为[0, 2^32) 内的整数的效果。

将此与+x仅将 x 强制为数字进行比较。

于 2013-06-20T21:22:08.957 回答
5

<<>>是位移操作,取一个整数并将所有位向左 ( <<) 或向右 ( >>) 移动 1 位。如果后跟另一个数字,则移位发生在那么多位上,因此256 << 4将位模式256向左移动 4 位(从右侧用四个零填充位模式)。

大多数编程语言都支持这些运算符,除非您编写的代码必须针对(通常是超快速的)整数运算的位模式进行操作,否则您通常没有理由使用它们。

作为 JavaScript 中的一个很好的怪癖,如果你对一个数字应用按位运算,它会被强制为一个整数,所以移动 0 位,或者用 0 进行 or 操作,... | 0会将“一个数字”变成一个 32 位整数。

于 2013-06-20T21:17:54.677 回答
1

在您的示例中,左移位运算符用于将值强制转换为 32 位整数。从我刚刚链接的 MDN 页面:

移位运算符以大端顺序将其操作数转换为 32 位整数,并返回与左操作数相同类型的结果。

通常,JavaScript 中的数字是双精度浮点数。

于 2013-06-20T21:19:29.533 回答