【JS面试题 - 打印结果】++[[]][+[]] + [+[]]

现有一段代码,说出打印结果

++[[]][+[]] + [+[]]

这道题考验的是运算符的基础知识,下面来逐步分析:

先把表达式按照优先级最低的运算符(+)进行分割,得到两部分:
++[[]][+[]] 和 [+[]]

++[[]][+[]]

表达式中++运算符优先级最低,所以先对 [[]][+[]] 进行运算:

这个表达式的目的是:取数组 [[]] 的第 [+[]] 项。
[[]]:表示数组中有一个元素为[]。
[+[]]:+[]会将[]转为Number类型,由于[]是对象类型,所以转换后得到:0,结果为[0]。具体流程为:由于+运算符会将数据转为Number类型,首先查看[].valueOf是否为Number,结果是[],并不是Number。所以需要toString,[].toString()得到 “”。最终把字符""转为数字,即0。隐式转换详情可看另一篇文章:隐式类型转换详解

所以[[]][+[]]结果为:[[]][0]也就是[]

那么++[]的结果为1

结果: 1。

[+[]]

通过上述流程可知,[+[]] 的结果为[0]。

最终运算

经过上述步骤,此时表达式已经转换为:1 + [0]

由于+运算符右侧为非原始类型(复杂类型<对象>),所以需要尝试将其转为原始类型。

流程如下:

  1. [0].valueOf 得到 [0],所以继续转换。
  2. [0].toString 得到字符 “0”,此时数据已为原始类型,停止转换。
  3. 至此,表达式变为:1 + “0”,所以答案为"10"

结果

“10”