console.log(++[[]][+[]] + [+[]])

66 阅读1分钟

逐步解析

第一步:理解基础转换规则

JavaScript 中的隐式类型转换:

  • +[]0(空数组转为数字)
  • ++ 操作符会将操作数转为数字后加1

第二步:分解表达式

原表达式:++[[]][+[]] + [+[]]

可以分为两部分:

  1. ++[[]][+[]](前缀递增运算)
  2. [+[]](数组)

第三步:计算过程

计算 ++[[]][+[]]

  1. [[]] → 包含一个空数组的数组:[[]]
  2. +[] → 空数组转为数字:0
  3. [[]][+[]][[]][0] → 取第0个元素:[]
  4. ++[[]][+[]]++[] → 空数组转为0后递增:1

计算 [+[]]

  1. +[]0
  2. [+[]][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 (属性不存在)

其他文章

操作符知识点 汇总目录