一、下列表达式输出多少
js
console.log(++[[]][+[]] + [+[]]);
题解:
- 遇到一些很长的复杂的表达式,用优先级最低的函数进行分割。
- 那么这个表达式里面最低的运算法
+
,于是把这个表达式分成两个部分++[[]][+[]]
和[+[]]
- 先来看
++[[]][+[]]
,同样的这个表达式优先级最低的是++
,那可以分成++
和[[]][+[]]
[[]][+[]]
表达式[[]]
不就是数组里面的元素是个数组么,[[]][]
表示取数组里面的第几个元素,[[]][+[]]
中的+[]
,数组前面一个+
号,表示 把这个对象变成一个数字,进行类型转换,首先调用对象的valueOf()
,看能不能得到原始类型,发现得不到,还是数组,然后调用数组的toString()
方法,看 能不能得到原始类型,得到了,得到了是一个''
,当调用数组的toString()
的时候,是把数组里面每一项依次罗列出来,当数组里面是空的时候,得到的自然是''
。 把''
转成数字是多少?是0
,于是[[]][+[]]
表达式就相当于[[]][0]
,得到的值就是[]
- 再把前面
++
加上,得到++[]
,根据上面的原理,所以其值为数字1
[+[]]
根据上面的原理,可以知道[+[]]
就相当于[0]
- 两边合在一起就是
1 + [0]
,不是同类型,无法加减,只能转类型,[0]
调用valueOf()
,再调用toString()
,得到字符串'0'
,加上有连接作用 所以最后答案'10'