[] + {}、{} + []、[] + [] 和 {} + {}的求值,其实也简单

144 阅读1分钟

高频面试题: [] + {}{} + [][] + []{} + {}的结果是?

答案:[object Object]'0''NaN

1、[] + {} + [] + []

在加号运算符中,先假定其是数字,如果不是则进行valueOf获取内部槽[[PrimitiveValue]]中的值,转换获取到的值如果不是基础类型,还会通过toString进行再次转换。
[].valueOf()的结果还是[],那么再通过toString进行转换,[].valueOf().toString()的结果为''
{}.valueOf()的结果还是{},那么再通过toString进行转换,{}.valueOf().toString()的结果为'[object Object]'
[] + {}:相当于'' + '[object Object]',结果为'[object Object]'
[] + []:相当于'' + '',结果为''

2、{} + []{} + {}

对于以上代码,{}开头,被解析为是代码块,而且自动加上了分号,相当于{}; + []{}; + {},也相当于+[]+{}。直接以+开头,相当于是对其进行数字的计算,直接通过Number进行求值,相当于Number([])Number({}),值分别为0NaN。所以{} + []0{} + {}NaN

总结

+中,会存在隐式类型转换的情况,主要是利用其valueOf获取内部槽中的[[PrimitiveValue]],如果拿到的值不为基础值,还会通过toString进行转换。如果直接以+开始,则相当于通过Number(x)进行了转换。