求解释{}和[]的诡异组合(http://bbs.51js.com/thread-90593-1-1.html)

大神求解释:
[]+[] = "" 这个可以理解为调用了toString

{}+{}=NaN 这个就不懂了

[]+{}=[object Object] 这是肿么了。。

{}+[]=0 小弟崩溃了。。*$**)@&(|#)~

这是种马回事啊?

==============================================Answer====================================

 

这个问题有点复杂:
//以下结果是你在chrome控制台直接敲的结果,
[]+[] = "" 这个可以理解为调用了toString
{}+{}=NaN 这个就不懂了
[]+{}=[object Object] 这是肿么了。。
{}+[]=0 小弟崩溃了。。*$**)@&(|#)~

//如果你调用console.log或者alert得到的结果将是这样的:
[]+[] = ""
{}+{}=[object Object][object Object]
[]+{}=[object Object]
{}+[] = [object Object]

之所以会造成以上两个的区别在于:
直接在控制台敲 []+[] ,然后回车,实际浏览器是调用了eval("[]+[]");的结果,就是说会把你敲的内容放到eval里去求值,而调用console.log或者alert,则相当于调用了alert(([]+[]).toString())的结果。
如果要想理解为什么eval出来的会和toString()出来的不一样呢,那就要从eval这个函数的解析过程说起来了。eval这个函数,是把里面的内容当作语句在解析的,并且总是返回最后一个语句的结果。如果你记得怎么将一个json字符串用eval转换成Object,那就更好理解了。在转换json的时候,需要这样写eval("("+json+")");才行。如果不这样写,eval会把里面的json字符串当成复合语句进行解析,执行,会抛异常。
OK,下面看我们逐个看:
eval ("[]+[]")//这个没得说
eval("{}+{}")/*注意看这里,这里的第一个{}被当成了复合语句进行处理,你还记得js中会自动插入分号作为语句结束。所以eval("{}+{}")其实等于eval("{};+{}")。然后返回的结果是eval("+{}")的值,就是最后一个语句的值,是NaN,懂了吗?如果你在控制台这样写"("+{}+{}+")",然后回车,将得到和console.log和alert一样的结果。*/
eval("[]+{}")//这个应该能理解吧,就是普通的+运算
eval("{}+[]")/*自己学习照第二个理解就行了*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值