1 前言
日常业务写的太多已经麻痹了神经,很多本该知道的知识早已抛之脑后,大家都知道在JS中函数是一等公民,但是竟然{有人|zuo zhe}连它的特性都不清楚,真是惭愧。
2 起因
在日常业务开发中,通常都会在数据中给一个默认值,然后在请求后端数据后替换掉默认值,如果完全替换整个对象肯能并不是我们想要的,也可能会出现一些为止的错误,又或者需要对一些数据做修改,这个时候就需要我们写一个函数去替换每个key对应的value,就在昨天我也遇到了同样的事情,废话就不多说了,直接上代码。
// form1为原始数据// form2为后端返回数据const mapForm = (form1, form2) => { for (let key in form1) {if (key in form2) { form1[key] = form2[key] } } }const form1 = { name: '', age: 0}const form2 = { name: 'mazi', age: 26} mapForm(form1, form2)console.log(form1) // { name: 'mazi', age: 26 }复制代码
3 问题
上面代码很明显可以看出在调用mapForm函数后form1的值已经和form2完全一致,其实这也正是我想要看到的,只是当时比较疑惑,因为之前并不知道js中函数如果传递复杂类型的话,形式参数和实际参数存在弱引用,所以这会导致form1的数据改变。
4 解决
如果在你的代码中也存在类似的情况,并且你不希望form1的对象改变,有个比较方便的办法就是直接使用JSON.parse(JSON.stringify(obj)的方式处理,代码修改如下:
...- mapForm(form1, form2)+ mapForm(JSON.parse(JSON.stringify(form1), form2)console.log(form1) // { name: '', age: 0 }复制代码
因为直接使用JSON.parse(JSON.stringify(obj)的方式并不安全,某些数据类型并不会如愿,所以可以尝试使用lodash库提供的cloneDeep函数,方式如下:
const objects = [{ 'a': 1 }, { 'b': 2 }]const deep = _.cloneDeep(objects)console.log(deep[0] === objects[0]) // false复制代码
如果觉得这篇文章对你有帮助,帮忙点个关注,谢谢,后续会陆续更新文章。