为了账号安全,请及时绑定邮箱和手机立即绑定

应该用forEach改变数组的值吗?

应该用forEach改变数组的值吗?

呼如林 2019-05-23 17:43:05
由于js中的数组是引用类型,所以可以利用类似指针的特性通过改变另一个变量去修改原始的值。我认为这其实是js中的缺陷,所以我不喜欢利用这个"缺陷"去实现一些功能,在最近的一次codereview中,同事指出了这个问题。所以我希望有更多朋友能给我一些建议。下面就是简单的例子。letarr=[{a:1,b:2,},{a:3,b:4,}];如果有以上数组,我需要将每一项的a改为3。大概有两种写法,一种是用forEach,另一种是用map来返回一个新数组(暂不考虑for循环)。forEach:arr.forEach((item)=>{item.a=3;});map:arr=arr.map((item)=>{//有同事指出应该声明一个新变量来存储map的结果,这个建议我认为是对的。item.a=3;returnitem;});
查看完整描述

2 回答

?
慕田峪9158850

TA贡献1794条经验 获得超7个赞

补充下,刚才没仔细看题目。题目的map方法不够“纯粹”,实际上还是直接修改了每个item的属性,要想不影响原有对象,应该这么写:
arr=arr.map((item)=>{//有同事指出应该声明一个新变量来存储map的结果,这个建议我认为是对的。
return{
...item,
a:3
}
});
==============
map方法体现的是数据不可变的思想。该思想认为所有的数据都是不能改变的,只能通过生成新的数据来达到修改的目的,因此直接对数组元素或对象属性进行操作的行为都是不可取的。这种思想其实有很多好处,最直接的就是避免了数据的隐式修改。immutable.js是实现数据不可变的一个库,可通过专属的API对引用类型进行操作,每次形成一个新的对象。
但具体到项目中还是要看团队的要求,都用或者都不用。单单局部使用是没有效果的。
如果使用了React+Redux的技术栈,是比较推荐使用的
另外有一点,forEach和map还存在一个编程思想的区别,前者是命令式编程,后者是声明式编程,如果项目的风格是声明式的,比如React,那么后者显然更统一。
                            
查看完整回答
反对 回复 2019-05-23
  • 2 回答
  • 0 关注
  • 2005 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信