我遇到了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"
答案 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==0
为true
,true
强制为1
个数字(如9.3 of ECMAScript spec所示)。