逐步解析
第一步:理解基础转换规则
JavaScript 中的隐式类型转换:
+[]→0(空数组转为数字)++操作符会将操作数转为数字后加1
第二步:分解表达式
原表达式:++[[]][+[]] + [+[]]
可以分为两部分:
++[[]][+[]](前缀递增运算)[+[]](数组)
第三步:计算过程
计算 ++[[]][+[]]
[[]]→ 包含一个空数组的数组:[[]]+[]→ 空数组转为数字:0[[]][+[]]→[[]][0]→ 取第0个元素:[]++[[]][+[]]→++[]→ 空数组转为0后递增:1
计算 [+[]]
+[]→0[+[]]→[0]
最终计算
++[[]][+[]] + [+[]] → 1 + [0] → 1 + '0' → '10'
注意:数字与数组相加时,数组会先转为字符串
核心知识点
类型转换规则
// 数组转换示例
[].valueOf(); // [] (返回自身)
[].toString(); // '' (空字符串)
+[]; // 0 (转为数字)
[1,2].valueOf(); // [1,2] (返回自身)
[1,2].toString(); // '1,2'
+[1,2]; // NaN
运算符优先级
- 前缀递增
++优先级高于加法+ - 数组访问
[]优先级最高
实际验证
// 分步验证
console.log(+[]); // 0
console.log([+[]]); // [0]
console.log([[]][+[]]); // []
console.log(++[[]][+[]]); // 1
console.log(1 + [0]); // '10'
扩展练习
类似的复杂表达式:
console.log(+!![]); // 1
console.log([][[]]); // undefined
console.log([]+[]); // ''
console.log({}+{}); // '[object Object][object Object]'
详细分析:[][[]]
这个表达式涉及数组属性访问和类型转换:
🔍 表达式拆解
[][[]]
│ └── 索引部分:[[]]
└────── 被访问对象:[](空数组)
转换原理:JavaScript 中,object[key] 的 key 必须是字符串或 Symbol
[[]] // 包含空数组的数组
[[].toString()] // 空数组转字符串为 ""
[""] // 包含空字符串的数组
[""].toString() // 最终转为空字符串 ""
验证:
console.log([[]] + ""); // "" (转为字符串)
console.log([][""]); // undefined (等价访问)
console.log([].hasOwnProperty("")); // false (属性不存在)