一、题目
下面代码的输出是什么
console.log(++[[]][+[]] + [+[]]);
二、变量类型转换
1.对于数字运算[负号-]、[减号-]、[乘号*]、[除号/]、[自加号++]等,其后的变量都会被尝试转换为数字;
- 如果其后变量是基础数据类型,那么按基础数据类型转换柜子转换;
- 如果其后变量是引用数据类型,那么会调用其toString()函数之后,将返回值进行转换;
/** 以下以负号举例,其他数字运算符同理**/
// 1.布尔值
const a = -true; // -1 true被转换为1
const b = -false; // -0 false被转换为0// 2.字符串
const c = -""; // -0 ""被转换为0
const d = -"100"; // -100 "100"被转换为100
const e = -"-100";// 100 "-100"被转换成了-100,此处“-”是负号,属于数字的一部分
const f = -"+100";// -100 "+100"被转换成了100,此处“+”是正号,属于数字的一部分
const g = -"1-2"; // NaN "1-2"不是纯数值字符串,无法被转换,此处“-”是减号
const h = -"1,2"; // NaN "1,2"不是纯数值字符串,无法被转换// 3.数组
const i = -[]; // -0 [].toString()是""
const j = -[100]; // -100 [100].toString()是"100"
const k = -[1,2]; // NaN [1, 2].toString()是"1,2"
3.如果是[加号+],那么其有3种情况;
- 表示正号:其后变量会被转换为数字;
- 表示加号:其前后都是数字的时候,其才会被认为是加号;
- 表示字符串拼接符:其前后至少一个不是数字;
// 1.表示正号
const a = +true; // 1
const b = +false; // 0// 2.表示字符串拼接符
const c = 1 + "0"; // "10"
const d = "1" + 0; // "10"
const e = 1 + []; // "1" [].toString()为""
const f = 1 + [0]; // "10" [0].toString()为"0"
三、解题
/**
题目:
++[[]][+[]] + [+[]]
*//**
前半部分++[[]][+[]]解析:
++: 表示自加,所以其后的[[]][+[]]会被转位数字
[[]]: 是一个包含一个空数组(暂称其为b)的数组(暂称其为a)
[+[]]: 是根在上述数组后面的,所以外部的中括弧表示数组取值,里面的部分由前面的分析得知为0
所以[[]][+[]]表示取出数组a中的空数组b
所以前半部分等价于++[],所以其为1,当然直接值么写会报错,题目中的写法和下面的写法不会报错
let a = [];
let b = ++a; // 1
综上:前半部分为1
*//**
后半部分[+[]]解析:
[+[]]: 已知为[0]
*//**
所以题目变成了:
1 + [0]
此处的+为字符串拼接符,所以结果是:
"10"
*/