1. 内容
鸭子类型
2. 搞懂这些,基本上就掌握了这部分知识(基于chrome运行)
[]
+[]
结果是什么?
首先,[]
被转换成一个原始值,调用valueOf()
方法,返回的是它本身,故其次调用toString()
方法,返回一个空字符串""
,因此[]
+[]
其实就是两个空字符串的连接。结果还是空字符串""
。
[]
+{}
结果是什么?
同上面步骤,{}
调用valueOf()
方法,返回的是它本身,故其次调用toString()
方法,返回一个"[object Object]"
,因此[]
+ {}
其实就是一个空字符串和"[object Object]"
的连接。结果返回"[object Object]"
。
{}
+[]
结果是什么?
如果左大括号出现在一条语句的开头,则其被解析成一个代码块的开始。结果返回0
。
{}
+{}
结果是什么?
"[object Object][object Object]"
5.[1,2]
+[3,4]
为什么≠[1,2,3,4]
?
首先数组先调用valueOf()
方法,返回的是它本身,故其次调用toString()
方法,返回一个字符串,于是其实最后就变成了两个字符串连接了。
[1, 2].concat([3, 4]) //[1, 2, 3, 4]
复制代码
++[[]][+[]]+[+[]] = ?
将以上转换为:
++[[]][+[]]
+
[+[]]
复制代码
+[] === 0
,简化:
++[[]][0]
+
[0]
复制代码
++
比 +
优先性更高,[[]][0]
:代表获取[[]]
第0
个元素,[[]]
返回空数组[]
,++
最后得到的一定是个数字,“加一”,则:
+([] + 1)
+
[0]
复制代码
[] + 1
相当于一个空字符串""
和数字1
的连接,故而结果"1"
,[0].toString()
为字符串"0"
,最终就变成了数字 + 字符串 ,结果为"10"
。