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

如何让JS函数获取调用时的对象原始值,避免外部修改且无需深克隆?

解决方案

因为JavaScript中对象是引用类型,myFunc接收的是对象的引用,后续修改theObj.parameter会直接改变引用指向的内存值,导致函数最终打印最新值。要保留调用时的原始值且避免深克隆的性能损耗,可采用以下几种高效方法:

方法1:直接传递原始属性值

调用函数时不传递整个对象,而是直接传入需要的属性值(基本类型为值传递,会生成独立副本):

let theObj = {
    parameter: '11'
}

function sleep(ms) {
    return new Promise(resolve => setTimeout(resolve, ms));
}

async function myFunc(param) {
    await sleep(5000)
    console.log(param)
}

myFunc(theObj.parameter)
theObj.parameter = '22'

执行后输出11,后续修改对象属性不会影响函数内保存的副本值。

方法2:函数内部立即保存属性值

如果必须传递整个对象,在函数执行await前(也就是调用函数的当下)立即提取并保存需要的属性值,避免后续修改的影响:

let theObj = {
    parameter: '11'
}

function sleep(ms) {
    return new Promise(resolve => setTimeout(resolve, ms));
}

async function myFunc(myObj) {
    // 立即捕获调用时的属性值
    const originalParam = myObj.parameter;
    await sleep(5000)
    console.log(originalParam)
}

myFunc(theObj)
theObj.parameter = '22'

通过局部变量保存原始值,后续修改对象属性不会改变这个局部变量的内容。

方法3:浅拷贝指定属性生成新对象

如果需要保持对象结构传递,只浅拷贝需要的属性生成新对象(仅复制目标属性,而非整个对象深克隆,性能开销极低):

let theObj = {
    parameter: '11'
}

function sleep(ms) {
    return new Promise(resolve => setTimeout(resolve, ms));
}

async function myFunc(myObj) {
    await sleep(5000)
    console.log(myObj.parameter)
}

// 仅拷贝需要的属性,创建独立对象
myFunc({ parameter: theObj.parameter })
theObj.parameter = '22'

新对象与原对象无引用关联,后续修改原对象不会影响函数内的新对象属性。

内容的提问来源于stack exchange,提问作者user3437245

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 10:10:24