JS求打印结果
const res = ([][[]] + [])[+!![]] + ([] + {})[+!![] + +!![]]
console.log(res)
乍一看很懵,但是逐字分析,慢慢隐式转换后,答案就清晰了。隐式转换的具体内容在此不多赘述,详情请看另一篇文章,JavaScript的隐式类型转换详解。
先分为前后两部分,分别是 ([][[]] + [])[+!![]] 和 ([] + {})[+!![] + +!![]]
分析第一部分
([][[]] + [])
[][[]]:这是取数组[] 的 [[]]项元素,[[]]中内层的[]会被隐式转换为"“空字符,所以[][”“]的结果为undefined。
undefined + [] : 原始类型undefined与复杂类型[]相+,会将复杂类型[]转为字符”",所以结果为 “undefined”。
[+!![]]
首先 !![] 是取 [] 隐式转换后的布尔值,由于[]是对象,所以隐式转换后对应的布尔值为true。
其次 +true 的+运算符会将其身后的数据隐式转换为Number类型,即 1。
结果
([][[]] + [])[+!![]]分析后为:“undefined”[1]。
由于字符串也具有索引,所以得到结果 “n”。
分析第二部分
([] + {})
两个复杂类型相加,会将二者转为简单类型,分别为 “” 和 “[object Object]”,二者相加,结果为: “[object Object]”。
[+!![] + +!![]]
+!![] 为 1,两个 !![]相加为2,结果为[2]。
结果
“[object Object]”[2],得到"b"。
最终结果
“nb”