隐式转换问题
参考知识点:
# 1. 以下代码输出什么?
console.log(++[[]][+[]]+[+[]]); // 10
1
该表达式拆分为 ++[[]][+[]]
,+
,[+[]]
。
- 对于
[+[]]
,由于+[]
会将[]
强转为数字,[]
转为数字的方法是调用toString()
得到空字符串""
再转换,因此+[]
得到0
,[+[]]
为[0]
。 - 因此
+
左边是++[[]][0]
,右边是[0]
。 - 中括号比
++
优先级更高,对于[[]][0]
,得到内部数组[]
的引用,称之为A
。 ++A
将A
强转为数字0
再执行自增(等同于(+A)+1
),即1
。- 式子整理为
1+[0]
,[0]
强转为字符串"0"
,结果返回1+"0"
即"10"
。
# 2. 以下代码输出什么?
console.log((!+[]+[]+![]).length); // 9
1
该表达式拆分为 !+[]
,+
,[]
,+
,![]
。
- 对于
!+[]
,它是表达式+[]
的取反布尔值,而表达式+[]
的值为[]
的强转数字值0
,因此表达式结果为true
。 - 对于
true + []
,[]
调用toString()
得到空字符串""
,两者相加得到字符串"true"
。 - 对于
![]
,它是表达式[]
的取反布尔值,而[]
被认为是 truthy,因此![]
结果为false
。 - 对于
"true" + false
,执行字符串连接,结果为"truefalse"
,长度为 9。
在 GitHub 中编辑此页 (opens new window)
上次更新于: 2022/11/3 23:25:22