如何让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
相关产品推荐
相关产品推荐

