跳至正文
LNN的博客!

可以运行的乱码JavaScript?)

console.log((![]+[])[+[]]+(![]+[])[+!+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]); // "fail"

这就nm离谱

讲解

以下每个表达式的值都是true

String([]) === ""; // 数组转换成字符串只是简单地用逗号拼接字符串,所以如果是空数组则会得到空字符串
+"" === 0; // 正号可以把值转换成数字,空字符串会被转换成0
+[] === 0; // 无法直接转换的会先转换成字符串在转换成数字,所以空数组会被转换成0
Boolean([]) === true; // 空数组转换成布尔值是真
![] === false; // 逻辑非会先转换成布尔值再计算
+![] === 0; // 假转换成数字是0
!+[] === true; // 0转换成布尔值是假,所以非0得到真
+!+[] === 1; // 真转换成数字是1
+!+[]+!+[] === 2; // 注意实际运算顺序是 +(!(+[])) + !(+[]) , 1 + true = 2
!![] === true; // 负负得正
[][[]] === undefined; // 方括号索引里的东西如果不是整数就统统转换成字符串,所以 [][[]] 相当于 new Array()[""]
+[][[]] !== +[][[]]; // 未定义转换成数字是NaN, NaN !== NaN
+[]+[] === "0"; // 如果加号两边都是数字或布尔值,会计算加法,否则就转成字符串,进行字符串拼接。0和空数组拼接得到字符串“0”
![]+[] === "false"; // false和空数组进行字符串拼接
!+[]+[] === "true"; // true和空数组进行字符串拼接
+!+[]+[] === "1"; // 1和空数组进行字符串拼接
[][[]]+[] === "undefined"; // 未定义和空数组进行字符串拼接
+[][[]]+[] === "NaN"; // NaN和空数组进行字符串拼接
"false"[0] === "f"; // 字符串索引可以得到字符串的第n个字符
(![]+[])[+[]] === "f"; // 简单代换一下
(![]+[])[+!+[]] === "a"; // "false"[1]
(![]+[])[+!+[]+!+[]] === "l"; // "false"[1+true]
([][[]]+[])[+[]] === "u"; // "undefined"[0]
String({}) === "[object Object]"; // 空对象转换成字符串是这一坨
({}+[])[+!+[]] === "o"; // "[object Object]"[1]
(![]+[])[+[]]+({}+[])[+!+[]]+({}+[])[+!+[]] === "foo"; // 缝合怪, "f"+"o"+"o"
[![]]+[][[]] === "falseundefined"; // [false] + undefined
+!+[]+[+[]] === "10"; // 1 + [0]
"falseundefined"["10"] === "falseundefined"[10]; // 方括号索引不分数字和字符串,这两个是等价的
([![]]+[][[]])[+!+[]+[+[]]] === "i"; // "falseundefined"["10"]。没有用 "undefined"[5] 应该是因为数字5不太方便拼出来
(![]+[])[!+[]+!+[]] === "l"; // "false"[true + true]
(![]+[])[+[]]+(![]+[])[+!+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]] === "fail"; // 缝合怪, "f"+"a"+"i"+"l"

评论区

加载基于 GitHub issues 的 utteranc.es 评论区组件……