在下面的代码片段中,为什么 whatDoesItDo()
函数将“fail”作为字符串返回?
如果有人可以解释这种行为背后的概念,那将会很有帮助。
function whatDoesItDo() {
return (![] + [])[+[]] + (![] + [])[+!+[]] +
([![]] + [][
[]
])[+!+[] + [+[]]] + (![] + [])[!+[] + !+[]];
}
function result() {
document.getElementById("result").innerHTML = whatDoesItDo();
}
result();
<html>
<body>
<p id="result"></p>
</body>
</html>
最佳答案
您将看到 A) 类型强制转换、B) 使用 []
对字符串进行索引以及 C) 字符串连接的效果。
让我们先看一下:
(![] + [])[+[]]
![]
给我们 false
因为 []
是一个强制为 true
的“真实”值当作为 bool 值测试时,![]
为 false
。
然后我们向它添加 []
,这会将它们都变成字符串,因为如果它们中的任何一个不是数字,+
运算符会将其两个参数强制转换为字符串(如果两者都是数字,它会相加),给我们 "false"
(因为 [].toString()
是 [].join()
即 ""
).
所以现在我们有了 "false"
。
然后,+[]
是 0
,因为它将空数组强制转换为一个数字,使其成为一个字符串 (""
), +""
为 0
。
最后,该值用于 “false”
:“false”[0]
是 “f
”。
依此类推,其余部分只是该主题的变体。 (!+[]
是 true
,稍后很重要。)
关于带有字符串和索引的 JavaScript 类型强制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30875019/