由于js中的数组是引用类型,所以可以利用类似指针的特性通过改变另一个变量去修改原始的值。我认为这其实是js中的缺陷,所以我不喜欢利用这个"缺陷"去实现一些功能,在最近的一次code review中,同事指出了这个问题。所以我希望有更多朋友能给我一些建议。
下面就是简单的例子。
let arr = [{
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;
return item;
});
补充下,刚才没仔细看题目。题目的
map
方法不够“纯粹”,实际上还是直接修改了每个item
的属性,要想不影响原有对象,应该这么写:==============
map
方法体现的是数据不可变的思想。该思想认为所有的数据都是不能改变的,只能通过生成新的数据来达到修改的目的,因此直接对数组元素或对象属性进行操作的行为都是不可取的。这种思想其实有很多好处,最直接的就是避免了数据的隐式修改。immutable.js
是实现数据不可变的一个库,可通过专属的API对引用类型进行操作,每次形成一个新的对象。但具体到项目中还是要看团队的要求,都用或者都不用。单单局部使用是没有效果的。
如果使用了
React + Redux
的技术栈,是比较推荐使用的另外有一点,
forEach
和map
还存在一个编程思想的区别,前者是命令式编程,后者是声明式编程,如果项目的风格是声明式的,比如React
,那么后者显然更统一。