一个有意思的javascript表达式

上周五有人在QQ群(腾讯微博API开发者群)发了一个javascript表达式,让大家求出该表达式的值,结果大家一看这个表达式都愣了。

++[[]][+[]]+[+[]]=?

随后他给出了答案:++[[]][+[]]+[+[]]=’10′,于是我开始寻思着为啥会等于10。

后来才知道这是一个老外在stackoverflow上的提问,我不得不感叹,这该是怎样一个提问者才想得出这样的问题啊!当然,当看到楼下的回答我才明白这其中的原因。

对表达式进行格式化一下:

++[[]][+[]]

+

[+[]]

在大部分语言中,[]是代表数组。当然如果没有元素则代表该数组为空。

现在开始层层剥开这个表达式~

+[]=0,且+[]==0和+[]===0都是为ture。原因是:在js里,+运算符将强制将[]转换为数值。因为此处为空数组,其实也就相当于+”"。

所以上面的表达式就可以变成:

++[[]][0]+[0]

现在就清晰多了,在大部分语言中,[0]是代表取下标为0的数组元素,即数组的第一个元素。所以 [[]][0]=[] ,当然,[[]][0]==[] 和 [[]][0]===[]都返回flase。

如果将 ++[[]][0] 中的[]先替换成A,则表达式为:++[A][0],求值出来即为++A,也就是A+1 。

现在将A换回来,即:[]+1,整个表达式为:[]+1+[0] 。因为第一个[]是空数组,所以等效于:”"+1+[0] 。字符串进行连接,所以等于:”1″+[0] 。

由于在js里,[0]==”0″,也[0]==0,所以”1″+[0]就等效于”1″+”0″或”1″+0 。

由于+运算符在js里面是进行了重载的,所以最后这个表达式求值就等于”10″。当然++[[]][+[]]+[+[]]===”10″和++[[]][+[]]+[+[]]==”10″都是返回true。

声明: 本文采用 BY-NC-SA 协议进行授权 | heroicYang
转载请注明转自《一个有意思的javascript表达式
标签: ,

这篇文章目前有3条评论

  1. 襄阳论坛: 2012-01-18 19:52

    期待啊 等待中

    沙发王 !
  2. crossyou: 2012-01-16 21:44

    哈哈,用上我的主题了呀。

    板凳党 !
    • heroicYang: 2012-01-16 21:46

      恩。简洁很舒服!期待最新版~

Leave a Reply

(必填项)

(必填项)

(可选)

Spam Protection by WP-SpamFree

字体大小: 减小一号 减小一号
▲ Back to top 繁體