一个有意思的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。

期待啊 等待中
哈哈,用上我的主题了呀。
恩。简洁很舒服!期待最新版~