解构赋值是JavaScript中按模式直接提取数组或对象值的底层能力:数组按位置、对象按属性名;支持跳过、剩余、重命名、嵌套及默认值,但对null/undefined会报错,且不创建新引用。
解构赋值不是语法糖,是 JavaScript 中真正改变数据提取方式的底层能力——它直接从数组或对象中“按模式提取值”,而非先取整个结构再手动索引。
本质是把等号右边的可迭代对象(如数组)按索引位置,映射到左边的变量列表。不关心变量名,只认位置。
const [a, b, c] = [1, 2, 3] → a 得 1,b 得 2,c 得 3
const [first, , third] = ['a', 'b', 'c'] → first 是 'a',third 是 'c'
... 收集,const [x, ...rest] = [10, 20, 30, 40] → rest 是 [20, 30, 40]
undefined 时生效,null、0、false 都不会触发:const [d = 99] = [0] → d 是 0,不是 99
左边写的是“模式”,不是声明;变量名默认需与属性名一致。想换名?得用冒号重绑定。
const { name, age } = { name: 'Alice', age: 30 } → 直接得到两个变量原属性名: 新变量名,const { title:
bookName } = { title: 'JS Guide' } → bookName 是 'JS Guide'
const { user: { profile: { city } } } = { user: { profile: { city: 'Beijing' } } } → city 是 'Beijing'
undefined 生效;若属性存在且值为 null,默认值不触发函数形参支持直接解构,常用于配置对象传参,但容易忽略“传入非对象”导致的运行时错误。
{},避免 undefined 解构报错:function log({ level = 'info', msg } = {}) { ... }
opts.user.name 但 opts.user 是 undefined),会立即抛 Cannot destructure property 'name' of 'undefined'
function first([head]) { return head; } → first([1,2,3]) 返回 1
解构本身不创建新对象或数组,只是绑定已有值的引用。修改解构出的变量,一般不影响源数据——但若解构的是对象属性,而该属性本身是引用类型,就另当别论。
let obj = { list: [1, 2] }; const { list } = obj; list.push(3); → 源 obj.list 也被改了,因为 list 和 obj.list 指向同一数组null 或 undefined 解构会直接报错:const { x } = null → TypeError;不能靠默认值兜底,必须提前判空或设参数默认值{ a, b } = data 会报语法错误(被解释为代码块),必须加括号:({ a, b } = data) 或放在 let/const 声明中最常被忽略的是解构的“静默失败”边界:它只在结构完全不匹配时才报错,其余时候宁可给 undefined 也不中断。这意味着你得主动检查解构结果是否符合预期,尤其在处理 API 响应或用户输入时。