高频面试题:
[] + {}、{} + []、[] + []和{} + {}的结果是?
答案:[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({}),值分别为0和NaN。所以{} + []为0,{} + {}为NaN。
总结
在+中,会存在隐式类型转换的情况,主要是利用其valueOf获取内部槽中的[[PrimitiveValue]],如果拿到的值不为基础值,还会通过toString进行转换。如果直接以+开始,则相当于通过Number(x)进行了转换。