为何传入函数的对象参数会像指针一样修改原数据?
为什么函数会修改原传入参数?
这是因为JavaScript里的对象是按引用传递的,不是你以为的传副本。
当你把this.book[currency][side][this.j[currency][side]]这个对象传给calculatePrice函数时,函数里的offer变量只是指向原对象内存地址的一个引用,不是原对象的拷贝。所以你在函数里执行offer.quality = 1 / offer.quality;时,其实直接修改的就是原对象的quality属性,原数据自然会跟着变。
怎么避免修改原数据?
如果你不想改动原对象,得先创建一个原对象的副本,再修改副本的属性:
static calculatePrice(offer) { // 创建原对象的浅拷贝 const newOffer = {...offer}; if (typeof (newOffer.TakerGets || newOffer.taker_gets) == "string") newOffer.quality = 1 / newOffer.quality; return newOffer.quality / 1000000; }
注意:上面用的是浅拷贝,如果offer里还有嵌套对象,浅拷贝不会复制嵌套对象的引用,这时需要用深拷贝(比如递归拷贝、JSON.parse(JSON.stringify(offer)),但后者有局限性,比如不能处理函数、Symbol等)。
内容的提问来源于stack exchange,提问作者user18227572
相关产品推荐
相关产品推荐

