在国外网站上看到一道javascript的题目:
++[[]][+[]]+[+[]];
值是多少?
虽然最js的语法还算熟,第一眼看到这个表达式的时候还是晕了.直接运行了一下,结果是字符串"10",
结果有点出乎意料,开始怀疑是不是某个浏览器的bug,又在四个浏览器里面都运行了一遍,均是此结果.
于是从结果开始倒推,推出了一些比较诡异逻辑.
首先 +[] ,相当于Number([]),根据 Number函数的转换规则,得到 +[] = 0;
于是,表达式
1. ++[[]][+[]]+[+[]]; ==>
2. ++[[]][0]+[0]; ==>
3. var i= [[]][0]; //相当于取数组[[]]的第一项,也就是[]
++i+[0]; ==>
4. 1+[0]; ==>
5. 1+[0].toString(); ==>
6. 结果"10"
结论: 可见数组 [] 作为 一元操作时, +[]相当于 Number([]) ; 而作为二元已上被操作数时, 1+[],相当于 1+[].toString();
javascript处处都是坑,稍不注意就踩进去了,实际工作中应尽量用常规语法,避免二义性,副作用,隐式转换等奇技淫巧
注:以上结论均为推导得出,若有错误,诚请指正!另外下面再给一个类似的例子可以验证下:
(![]+[])[0];