将复杂对象作为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
相关产品推荐
相关产品推荐

