JavaScript类型强制与字符串和索引

时间:2015-06-16 18:09:16

标签: javascript type-conversion type-coercion

在下面的代码片段中,为什么whatDoesItDo()函数会以字符串形式返回“fail”? 如果有人能够解释这种行为背后的概念,那将会很有帮助。

function whatDoesItDo() {

  return (![] + [])[+[]] + (![] + [])[+!+[]] +
    ([![]] + [][
      []
    ])[+!+[] + [+[]]] + (![] + [])[!+[] + !+[]];

}

function result() {

  document.getElementById("result").innerHTML = whatDoesItDo();

}

result();
<html>

<body>
  <p id="result"></p>
</body>

</html>

1 个答案:

答案 0 :(得分:14)

您正在看到A)类型强制的影响,B)使用[]索引到字符串,以及C)字符串连接。

让我们看看第一位:

(![] + [])[+[]]

![]为我们提供了false,因为[]是一个&#34;真实的&#34;在作为布尔值测试时强制为true的值,因此![]false

然后我们向它添加[],它们将它们都变成字符串,因为+运算符强制它的两个字符串的参数,如果它们中的任何一个都不是数字(如果两个都是数字,它补充说,给我们"false"(因为[].toString()[].join() ""}。

现在我们有"false"

然后,+[]0,因为它会将空数组强制转换为数字,从而将其作为字符串(""),+""为{{ 1}}。

最后,该值用于0"false""false"[0]&#34;。

依此类推,其余部分只是该主题的变体。 ("f!+[],后来很重要。)