为什么typeof返回“string1”或“number1”

时间:2013-12-12 23:34:51

标签: javascript

我遇到了typeof运算符的奇怪行为,我没有找到任何内容,只要描述了这种行为。

typeof ([(0==0)+(0==0)]+[0])+((0==0)<<0) // "string1"

typeof (0^[(0==0)+(0==0)]+[0])+((0==0)<<0) // "number1"

typeof (0>>(0==0))+([0]+[(0==0)+(0==0)]^0) // "number2"

2 个答案:

答案 0 :(得分:7)

你正在进行两个系列的操作:

typeof ([(0==0)+(0==0)]+[0])   +   ((0==0)<<0)

"string" + ((0==0)<<0)

"string" + 1

"string1"
所有其他人都一样。

答案 1 :(得分:4)

或多或少:

  typeof ([(0==0)+(0==0)]+[0])+((0==0)<<0)
= typeof ([   1  +  1   ]+[0])+(1<<0)
= typeof (     [2]       +[0])+(1)
= typeof ("20")               + 1
= "string"                    + 1
= "string1"

两个数组连接的部分(第三行)有效,因为在评估+表达式时,数组被强制转换为数字(使用Array.prototype.toString())。

表达式的右侧部分有效,因为0==0truetrue强制为1个数字(如9.3 of ECMAScript spec所示)。