在国外网站上看到一道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];

 
posted on 2013-04-10 15:20  川川哥哥  阅读(630)  评论(2编辑  收藏  举报