You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将复杂对象作为JavaScript函数默认参数的性能影响

将复杂对象作为JavaScript函数默认参数的性能影响

EDIT:之前我搞错了Python里的相关问题——它的问题出在可变对象上,而不是性能。

感谢大家帮我纠正了对这个问题的理解,我把这段内容保留下来,希望能帮到有同样困惑的朋友。如果你想了解JavaScript默认参数中可变对象的相关内容,可以参考Stack Overflow上的相关讨论。


原始问题

我想把一个非常复杂的对象用作函数的默认参数。比如在Prisma ORM中,你可以把多个数据库调用包装在一个事务里:

this.prisma.$transaction(async (tx) => {
  await tx.table1.create()
  await tx.table2.create()
})

这些内部的数据库调用可能会很复杂,所以我想写一些辅助函数来处理。但这些辅助函数可能会被很多地方调用,可能在事务内部,也可能不在。为了解决这个问题,我打算可选地传入事务对象,如果存在就用它:

// 带复杂默认参数的函数
async createModelIfNotExists(name, color, prisma = this.prisma) {
  return await prisma.upsert({...})
}

...

// 在事务内调用,使用事务的prisma客户端:
this.prisma.$transaction(async (tx) => {
  this.createModelIfNotExists("new model 1", "blue", tx)
  ...
})

// 单独调用,使用绑定到this的prisma对象
this.createModelIfNotExists("new model 2", "green")

要说明的是,tx是个非常庞大且复杂的对象——它管理着数据库连接,还会跟踪我所有的模型。

我的问题是:这么做会有性能开销吗?在Python里是会有的,因为Python会“自作聪明”地提前初始化默认参数,哪怕你根本没调用函数。如果按照Python里的稳妥写法,我可能会把函数写成这样:

// 现在默认参数在函数内部处理
async createModelIfNotExists(name, color, prisma = null) {
  prisma = prisma ?? this.prisma
  return await prisma.upsert({...})
}

我担心的是,如果用第一种写法,会不会哪怕我传入了事务对象、根本没用到默认的this.prisma,也会有实例化这个复杂对象的开销?

我谷歌过这个问题,但搜到的都是关于程序员自己定义的基础JS对象的内容,没找到针对这种场景的。

或者,如果有人能告诉我怎么测试这种情况的性能,我自己来测也行。


备注:内容来源于stack exchange,提问作者user29971781

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 18:58:08