非数字的按位操作

16

一些奇怪的情况下,JavaScript 能够以明确的方式处理非数字类型的按位运算符,例如 NaN ^ 1Infinity ^ 1 以及 'a' ^ 1(它们都会计算为1)。

对于非数字类型,按位运算符的规则是什么?为什么上述所有示例都计算为1

2个回答

14
根据ES5规范,进行按位操作时,所有操作数都会转换为ToInt32(首先调用ToNumber。如果值为NaNInfinity,则转换为0)。
因此:NaN ^ 1 => 0 XOR 1 => 1

1
那些规范... +1,我认为它是 function bitwise(obj){ if (typeof o !== "Number") return 1; } - gdoron
@gdoron:得爱这个规范 :-P - gen_Eric
1
如果他们会给我你的声望,我就... :) 值得一提的是,结果取决于第二个操作数。例如:"A" ^ 2 === 2 // true - gdoron
1
为了完整起见,任何非数字字面字符串都是**NaN**,因此"a" ^ 1 = 1 - Alexander
@Alexander。几乎所有非数字(如对象和数组)都被评估为NaN。/fndsjkn/ ^ 1 == 1 - gdoron

3

ECMA-262第11.10节定义了二进制位运算符的参数使用ToInt32进行转换。而9.5节解释了ToInt32,在其前两点中提到:

  1. 将输入参数调用ToNumber的结果赋给数字。
  2. 如果数字是NaN、+0、-0、+Inf或-Inf,则返回+0。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接