函数参数解构是与this、arguments、length、prototype协同的设计机制,不改变函数运行时行为;length统计非默认值形参个数,解构不增加参数数量;arguments仍存在但不自动展开解构结构;this绑定与解构正交;prototype和apply/call按原逻辑工作。

函数参数解构不是语法糖的点缀,而是与函数自身属性(如 this、arguments、length、prototype)协同工作的设计机制。它改变的是“如何接收参数”,但不干扰函数运行时的行为逻辑——比如 this 的绑定、arguments 的存在性、或 length 的统计规则依然照常生效。
解构不影响函数 length 属性
函数的 length 属性返回的是**形参列表中非默认值参数的个数**,与是否解构无关。解构本身不增加参数数量,只是对单个参数做模式匹配。
-
function f({a, b}) {}→f.length === 1(只有一个形参:对象) -
function g({a, b} = {}) {}→g.length === 0(因该参数有默认值) -
function h([x, y], z) {}→h.length === 2(两个形参,第二个无默认值)
解构后仍可访问 arguments(但慎用)
即使使用了对象或数组解构,arguments 对象依然存在,且完整包含所有实参(包括被解构的那个对象或数组)。但它不会自动“展开”解构结构。
-
function fn({x, y}) { console.log(arguments[0]); }→ 输出传入的整个对象,不是x或y - 若需兼容旧写法(如遍历所有参数),解构和
arguments可共存,但语义上已冗余;现代写法更推荐用剩余参数...rest
this 绑定与解构完全正交
解构发生在函数体执行初期,而 this 的值由调用方式决定(如 obj.method()、call()、箭头函数继承等)。解构过程不改变 this,也不依赖它。
-
const obj = { val: 42 }; function show({x}) { console.log(this.val, x); } show.call(obj, {x: 99});→ 输出42 99 - 解构失败(如传入
null)会抛TypeError,但这个错误发生在this已确定之后
prototype 和 apply/call 仍按原逻辑工作
解构参数的函数依然拥有 prototype(除非是箭头函数),也能正常被 apply 或 call 调用。关键在于:传给 apply 的“参数数组”必须对应解构前的形参结构。
function calc({a, b}, op) { return op === '+' ? a + b : a - b; }- 正确调用:
calc.apply(null, [{a: 5, b: 3}, '+']) - 错误调用:
calc.apply(null, [5, 3, '+'])→ 解构失败,a为undefined

















