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

Fla*_*ake 1 javascript type-conversion type-coercion

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

function whatDoesItDo() {

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

}

function result() {

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

}

result();
Run Code Online (Sandbox Code Playgroud)
<html>

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

</html>
Run Code Online (Sandbox Code Playgroud)

T.J*_*der 14

您正在看到A)类型强制的影响,B)使用[]和C)字符串串联索引到字符串.

让我们看看第一位:

(![] + [])[+[]]
Run Code Online (Sandbox Code Playgroud)

![]让我们false因为[]是一个"truthy"的价值,它可以强制以true当作为布尔测试,所以![]false.

然后,我们添加[]到它,这把它们都转换为字符串,因为+运营商要挟它的两个参数为字符串,如果其中一方不是数字(如果两个都是数字,它增加了),给我们"false"(因为[].toString()[].join()这是"").

所以现在我们有了"false".

然后,+[]0因为它将空数组强制转换为数字,这使得它成为一个字符串(""),并且+""0.

最后,该值用于"false": "false"[0]"f".

等等,其余部分只是该主题的变体.(!+[]true,后来很重要.)

  • @ b.enoit.be` [] [[]]`是`[] [""]`这是*undef**i**ned*:-) (6认同)
  • @TJCrowder好的,我不得不问 - 完全出于好奇心,在meta上找到你的问题.我得到的是`f`,`a`和`l`来自"cast"bool到string并且只获得该字符串的第n个字符.但是`i`来自哪里? (3认同)
  • @b.enoit.be:卢卡斯说的。:-) 具体来说,`([![]] + [][[]])` 最终是 `falseundefined`。我们用 `+!+[] + [+[]]` 索引到它,它最终是 `"10"`。`falseundefined` 的第 11 个字符是 `i`。 (2认同)