隐式转换问题
参考知识点:
# 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