【JS面试题 - 打印结果】++[[]][+[]] + [+[]]
现有一段代码,说出打印结果
++[[]][+[]] + [+[]]
这道题考验的是运算符的基础知识,下面来逐步分析:
先把表达式按照优先级最低的运算符(+)进行分割,得到两部分:
++[[]][+[]] 和 [+[]]
++[[]][+[]]
表达式中++运算符优先级最低,所以先对 [[]][+[]] 进行运算:
这个表达式的目的是:取数组 [[]] 的第 [+[]] 项。
[[]]:
表示数组中有一个元素为[]。
[+[]]:
+[]会将[]转为Number类型,由于[]是对象类型,所以转换后得到:0
,结果为[0]
。具体流程为:由于+运算符会将数据转为Number类型,首先查看[].valueOf是否为Number,结果是[],并不是Number。所以需要toString,[].toString()得到 “”。最终把字符""转为数字,即0。隐式转换详情可看另一篇文章:隐式类型转换详解。
所以[[]][+[]]结果
为:[[]][0]也就是[]
。
那么++[]的结果为1
。
结果:
1。
[+[]]
通过上述流程可知,[+[]] 的结果为[0]。
最终运算
经过上述步骤,此时表达式已经转换为:1 + [0]。
由于+运算符右侧为非原始类型(复杂类型<对象>),所以需要尝试将其转为原始类型。
流程如下:
- [0].valueOf 得到 [0],所以继续转换。
- [0].toString 得到字符 “0”,此时数据已为原始类型,停止转换。
- 至此,表达式变为:1 + “0”,所以答案为
"10"
。
结果
“10”