函数参数默认值与解构赋值默认值均在每次调用且参数为undefined时惰性求值,表达式重复执行、对象字面量每次新建、深层嵌套未兜底易报错,高频场景需规避高开销默认值和过度嵌套解构。

函数参数默认值本身几乎没有运行时开销,解构赋值的性能影响也极小,但在高频调用或深层嵌套场景下,需注意默认值表达式重复执行和对象创建带来的实际成本。
默认值表达式每次调用都重新求值
参数默认值(包括解构中的默认值)不是在函数定义时计算,而是在每次调用、且该参数为 undefined 时才执行。这意味着:
- 若默认值是函数调用(如
Date.now()、Math.random()),每次触发都会执行一次 - 若默认值是对象或数组字面量(如
opts = { timeout: 5000 }),每次都会新建一个独立对象,不会复用 - 副作用逻辑(如日志、计数器)会在每次未传参时发生,可能影响可预测性
解构本身开销低,但嵌套过深会增加解析负担
现代引擎对单层对象/数组解构做了高度优化,基本可忽略性能差异。但以下情况值得关注:
- 多层嵌套解构(如
{ a: { b: { c: { d } } } } = obj)需逐级访问属性,若某层为undefined,会提前报错或依赖兜底对象 - 未加兜底空对象(如漏写
= {})会导致Cannot destructure property 'x' of undefined,错误处理本身有成本 - 解构同时设默认值(如
{ url, timeout = 3000 } = config)比单纯点取属性略慢,但差距通常在纳秒级
高频场景下的实用建议
对每秒调用成百上千次的函数(如渲染循环、事件处理器),可考虑:
- 避免在默认值中调用高开销函数;改用静态值或缓存后的结果
- 深层配置对象若极少变动,可预先解构并缓存变量,而非每次调用都解构
- 用
Object.assign({}, defaults, input)或展开运算符替代复杂解构,当字段数量大且动态性强时更易维护 - 对关键路径函数,可通过
console.time实测不同写法耗时,而非仅凭直觉判断
日常开发中无需过度担忧,现代 V8 和 SpiderMonkey 引擎已将解构与默认参数优化得非常高效。真正影响性能的往往是算法逻辑或 DOM 操作,而非这一层语法糖。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











