关于javascript:你可能不知道的JS函数

4次阅读

共计 1017 个字符,预计需要花费 3 分钟才能阅读完成。

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

如果感觉这篇文章对你有帮忙,帮忙点个关注,谢谢,后续会陆续更新文章。

正文完
 0