在下面的代码片段中,为什么whatDoesItDo()
函数会以字符串形式返回“fail”?
如果有人能够解释这种行为背后的概念,那将会很有帮助。
function whatDoesItDo() {
return (![] + [])[+[]] + (![] + [])[+!+[]] +
([![]] + [][
[]
])[+!+[] + [+[]]] + (![] + [])[!+[] + !+[]];
}
function result() {
document.getElementById("result").innerHTML = whatDoesItDo();
}
result();
<html>
<body>
<p id="result"></p>
</body>
</html>
答案 0 :(得分:14)
您正在看到A)类型强制的影响,B)使用[]
索引到字符串,以及C)字符串连接。
让我们看看第一位:
(![] + [])[+[]]
![]
为我们提供了false
,因为[]
是一个&#34;真实的&#34;在作为布尔值测试时强制为true
的值,因此![]
为false
。
然后我们向它添加[]
,它们将它们都变成字符串,因为+
运算符强制它的两个字符串的参数,如果它们中的任何一个都不是数字(如果两个都是数字,它补充说,给我们"false"
(因为[].toString()
是[].join()
""
}。
现在我们有"false"
。
然后,+[]
为0
,因为它会将空数组强制转换为数字,从而将其作为字符串(""
),+""
为{{ 1}}。
最后,该值用于0
:"false"
为"false"[0]
&#34;。
依此类推,其余部分只是该主题的变体。 ("f
是!+[]
,后来很重要。)