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

 

相关文章:

  • 2021-11-12
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-01-18
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2022-02-21
  • 2019-02-22
  • 2021-06-13
相关资源
相似解决方案