解构赋值默认值仅在值严格等于undefined时生效;null、false、0、''、NaN等falsy值均不触发,默认值机制不覆盖falsy值,需用??或||等手动处理。

JavaScript原始类型在解构赋值中设置默认值,只在被解构的属性值为 undefined 时生效;null、false、0、''、NaN 等“falsy”值不会触发默认值。
默认值触发的唯一条件:值严格等于 undefined
解构赋值(包括对象和数组)中,只有当对应位置的值是 undefined(严格相等),才会使用默认值。其他所有 falsy 值都会被原样赋值。
-
// 对象解构
const { a = 10 } = { a: null }; // a → null(不是 10)const { b = 20 } = { b: 0 }; // b → 0const { c = 30 } = { c: undefined }; // c → 30(触发默认值)const { d = 40 } = {}; // d → 40(d 不存在,隐式为 undefined) -
// 数组解构
const [x = 100] = [null]; // x → nullconst [y = 200] = [undefined]; // y → 200const [z = 300] = []; // z → 300(索引 0 不存在 → undefined)
注意:undefined 的来源不止是“缺失”,还包括显式赋值
即使属性存在且被显式设为 undefined,也会触发默认值——这和“属性不存在”效果一致。
const obj = { a: undefined }; const { a = 5 } = obj; // a → 5const arr = [, 2]; const [p = 1, q = 2] = arr; // p → 1(索引 0 是空位,等价于 undefined),q → 2
原始类型本身不影响逻辑,但需注意包装对象陷阱
原始类型(string/number/boolean/null/undefined/symbol)在解构中按值处理。唯一容易混淆的是:用 new String()、new Number() 等创建的包装对象,在解构时会自动拆箱(调用 valueOf()),但若包装对象为 new Boolean(false),解构后仍是 false,**不会触发默认值**——因为它是明确的布尔值,不是 undefined。
立即学习“Java免费学习笔记(深入)”;
const { v = 'default' } = { v: new String('hello') }; // v → 'hello'const { w = true } = { w: new Boolean(false) }; // w → false(不是 true)
想对 falsy 值也启用默认值?需手动处理
解构默认值机制不覆盖 falsy 值。如需类似行为,可结合逻辑运算符或三元运算符后置处理:
const { a } = obj; const finalA = a ?? 'fallback'; // null/undefined 回退(ES2020 空值合并)const { b } = obj; const finalB = b || 'fallback'; // 所有 falsy 值回退(慎用:0 和 '' 也会被替换)- 或封装成函数:
const getOrElse = (val, def) => val === undefined ? def : val;










