一个括号引发的蛋疼

作者:邹阳 | 发表于:2016-04-17 19:24:04

阅读量:(231) | 所属栏目:编程

前几天在网上看到很有趣的两个问题:
{}+{} 等于多少?
({}+{}) 等于多少?
本人一看,这么小儿科的问题,都让开,让我来装下逼,于是答到:
{}+{} 等于 NaN
({}+{}) 等于 NaN

答完,别人却说不对。我擦,打死我,也不信,于是我在浏览器试了一下,发现结果还真的是不对的。
{}+{} 等于 NaN
({}+{}) 等于 "[object Object][object Object]"
装逼不成,反被撕。这下老脸都不知道丢到哪里去了。冷静一番后,我对这个问题产生了深厚的兴趣,为什么加了个括号后,结果却差别这么大。
经过一番苦苦找寻源由后,我终于发现原来是浏览器解析的问题。

在{ } + { }中,
1. 浏览器会把第一个{ }当成是一个语句块,像if语句中的{}一样。因为当浏览器寻找一份声明中,看到第一个左括号时,即{,就傻乎乎把它当做是一个语句块,但是里面的内容是空的,所以什么也不会做。
2. 而接下来遇到+时,浏览器会把它当成是一元运算符,所以+{}会被当成表达式。在表达式中,{是对象初始化,而不是一个语句块开始,所以{}是一个对象,然后+试图转化{}对象成为一个数字,最终得到NaN。
所以 {}+{} 其实等价于 +{}
在({}+{})中,
1. 当浏览器遇到(,会把它当成是一个运算符,所以({}+{})会被当成一个一个表达式。
2. 在表达式中,两个{}会被当成两个对象,而一元运算符+,则变成字符串连接符,+将尝试将两个对象转化为字符串,所以两个{}分别调用自己的toString方法,将自己转化为"[object Object]" 。

所以最终的结果是 "[object Object]" +"[object Object]"  等于  "[object Object][object Object]"

说到实际运用中,
有些人以前一般会使用eval函数格式化JSON数据,但是我们会在参数中是添加'('和')',例如eval("({'a':1,'b':2})")。
聪明的骚年啊,现在知道原因是什么了吧!
回复内容:(还能输入1000字)
验 证 码: