在Chrome浏览器中如何计算表达式{a:{b:2}}+10?
哈哈,这个问题其实是JS里一个很经典的「语法歧义」坑,我来给你拆解清楚Chrome里的计算逻辑:
情况1:直接在Chrome控制台输入
{a:{b:2}}+10 这时候Chrome会把开头的{解析成语句块的起始标记,而不是对象字面量。整个代码会被拆成两部分执行:
- 第一部分是语句块:
{ a: { b: 2 } }
这里面的a是一个标签语句的标签,后面的{b:2}又是一个嵌套的语句块,b同样是标签,2只是一个无意义的表达式语句。这个语句块执行完后不会产生任何返回值。 - 第二部分是单独的表达式
+10:
这里的+是一元正号运算符,作用是确保10作为数字处理(其实它本身就是数字),所以最终控制台会输出10。
情况2:用括号包裹对象字面量,比如
({a:{b:2}}+10) 括号会强制Chrome把{a:{b:2}}解析成对象字面量,这时候才会触发JS标准的类型转换逻辑:
- 第一步:JS需要把对象转换为原始值,先调用对象的
valueOf()方法。默认的valueOf()会返回对象本身,不是原始值,所以继续下一步; - 第二步:调用对象的
toString()方法,普通对象的默认toString()会返回字符串"[object Object]"; - 第三步:
+运算符遇到字符串和数字时,会把数字10转换成字符串"10",然后执行字符串拼接,最终得到结果"[object Object]10"。
额外提一句:如果想让Chrome把开头的{}当作对象,除了加括号,还可以在前面加一元运算符(比如+{a:{b:2}}+10),但这时候结果会是NaN10(因为+{a:{b:2}}会把对象转成NaN),显然不是你想要的,所以最稳妥的还是用括号包裹对象字面量。
内容的提问来源于stack exchange,提问作者holiday peng
相关产品推荐
相关产品推荐

