">>>"运营商 - 用于什么?

kub*_*uba 5 javascript operators

我只是通过Mozilla开发人员文档查看,并发现我不知道用于什么的符号,也无法通过互联网找到任何信息.

阵列过滤器polyfill - 第10行

var t = Object(this);
var len = t.length >>> 0;
Run Code Online (Sandbox Code Playgroud)

有什么建议这个运营商是为了什么?

the*_*eye 4

长话短说

\n\n
t.length >>> 0;\n
Run Code Online (Sandbox Code Playgroud)\n\n

实际上尝试从 中获取有效的 32 位无符号整数t.length。据我们所知,t.length可以是任何类型(对象、数组、字符串等)。>>> 0如果它已经是有效的 32 位无符号数,则返回未更改的值。例如,

\n\n
console.log({} >>> 0);\n// 0\nconsole.log([] >>> 0);\n// 0\nconsole.log("Google" >>> 0);\n// 0\n
Run Code Online (Sandbox Code Playgroud)\n\n

通常,这种按位技巧用于避免if块类型检查,如下所示

\n\n
var len = 0;\nif (typeof data === \'number\') {\n    len = data;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果它是浮点值,我们可能仍然需要转换len为整数。

\n\n

解释

\n\n

>>>称为零填充右移运算符。除了用作按位运算符之外,它还用于从对象中获取 32 位数值。ECMA Script 5.1 规范>>>指出

\n\n
\n
    \n
  1. lref为计算ShiftExpression的结果。
  2. \n
  3. lval为 GetValue( lref )。
  4. \n
  5. rref为计算AdditiveExpression的结果。
  6. \n
  7. rval为 GetValue( rref )。
  8. \n
  9. lnum为 ToUint32( lval )。
  10. \n
  11. rnum为 ToUint32( rval )。
  12. \n
  13. shiftCount为屏蔽掉rnum的除最低有效 5 位之外的所有结果,即计算rnum & 0x1F。
  14. \n
  15. 返回对lnum执行零填充右移 shiftCount 位的结果。空出的位用零填充。结果是一个无符号 32 位整数。
  16. \n
\n
\n\n

它基本上将两个操作数都转换为 32 位无符号整数(步骤 5 和 6),并将左侧表达式、右侧表达式移位几次。

\n\n

如果我们看一下的定义ToInt32

\n\n
\n
    \n
  1. number为对输入参数调用 ToNumber 的结果。
  2. \n
  3. 如果数字为 NaN、+0、\xe2\x88\x920、+\xe2\x88\x9e 或 \xe2\x88\x92\xe2\x88\x9e,则返回 +0。
  4. \n
  5. posInt为sign( number )*floor(abs( number ))。
  6. \n
  7. int32bitposInt modulo 2 32;即,具有正号且大小小于 2 32的 Number 类型的有限整数值k,使得posIntk的数学差在数学上是 2 32的整数倍。
  8. \n
  9. 返回int32bit
  10. \n
\n
\n\n

首先,参数被转换为一个数字(如果它不是一个有效的数字,那么NaN将由 返回ToNumber)。步骤 4 确保您返回 0 到 2 32范围内的有效数字。

\n

  • _*向更好的答案鞠躬*_ +1(看来狗在这个问题上占据了至高无上的地位;-)) (2认同)