《ES6 解构:语法、规则与大厂面试考点精析》

0 阅读3分钟

ES6 解构:语法、规则与大厂面试考点精析

在 ES6 的新特性中,解构赋值无疑是提升代码简洁性的核心语法之一。

一、解构的核心规则

  1. 匹配规则:解构本质是 “模式匹配”—— 数组按索引顺序匹配,对象按属性名匹配,不匹配的变量会赋值为undefined
  2. 解构默认值:当提取的值为undefined时,会触发默认值(需注意:null0''等 falsy 值不会触发)。
  3. 不完全解构:允许只提取部分数据,剩余未匹配的结构不会影响解构结果。
  4. 可嵌套解构:支持数组、对象的多层嵌套,嵌套结构需与原数据格式一致。
  5. 解构失败处理:若解构目标为nullundefined,会抛出 TypeError,需提前确保目标存在。
  6. 非数组 / 对象的解构适配:字符串、数值、布尔值解构时会先转为对象(null/undefined除外),可提取其原生属性。

二、常用语法速览

1. 数组解构

// 基础用法(按索引匹配)
const [a, b] = [1, 2]; // a=1,b=2
// 跳过元素
const [, c, d] = [3, 4, 5]; // c=4,d=5
// 剩余元素(rest运算符)
const [x, ...y] = [6, 7, 8]; // x=6,y=[7,8]
// 默认值
const [p = 10] = []; // p=10(解构值为undefined时触发)

2. 对象解构

// 基础用法(按属性名匹配)
const { name, age } = { name: '张三', age: 20 }; // name='张三',age=20
// 别名赋值(解决变量名冲突)
const { id: userId } = { id: 1001 }; // userId=1001
// 嵌套解构
const { user: { address } } = { user: { address: '北京' } }; // address='北京'
// 默认值
const { gender = '男' } = { name: '李四' }; // gender='男'

3. 字符串解构

字符串解构的本质是:将字符串转为 “类数组对象”(具备索引和length属性),因此既可以按索引提取字符,也能提取其length属性。

// 按索引提取字符
const [a, b, c, d, e] = 'hello'; // a='h',b='e',c='l',d='l',e='o'
// 提取length属性(新增示例)
let { length: len } = 'hello'; 
// 解释:
// 1. 字符串'hello'被转为类数组对象,该对象包含原生属性length(值为5);
// 2. 解构时按属性名匹配'length',并通过别名赋值给变量len;
// 3. 最终len = 5
len // 5

4. 其他常用场景

  • 数值 / 布尔值解构(提取原型方法):

    const { toString: numToString } = 123;
    numToString === Number.prototype.toString; // true
    
  • 函数参数解构(简化参数处理):

    function fn({ name, age = 18 }) {
      console.log(name, age);
    }
    fn({ name: '王五' }); // 王五 18
    

三、大厂面试高频考点

  1. 解构默认值的触发条件:考点:const [a = 1] = [null]; 中 a 的值是多少?(答案:null,只有解构值为undefined才触发默认值)。
  2. 对象解构的属性名与变量名差异:考点:如何提取对象中let属性(关键字冲突)?(答案:使用别名 const { let: myLet } = { let: 10 };)。
  3. 嵌套解构的错误处理:考点:const { user: { address } } = { name: '赵六' }; 会报错吗?(答案:会,userundefined,无法解构address,需加默认值 const { user: { address } = {} } = { name: '赵六' };)。
  4. rest 运算符与解构结合:考点:const [a, ...b] = [1, 2, 3, 4]; 中 b 的类型是什么?(答案:数组 [2,3,4],rest 运算符仅能作为最后一个元素)。
  5. 函数参数解构的应用:考点:如何简化 React 组件的 props 传递?(答案:const Component = ({ name, age }) => <div>{name}{age}</div>)。
  6. 字符串解构的特殊用法(新增考点):考点:const { length: l } = 'es6'; 中 l 的值是多少?(答案:3,字符串转为类数组对象后可提取 length 属性)。

总结

解构的核心是 “模式匹配 + 简洁赋值”。