应该用forEach改变数组的值吗?
由于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`的属性，要想不影响原有对象，应该这么写：
```
arr = arr.map((item) => {   //  有同事指出应该声明一个新变量来存储map的结果，这个建议我认为是对的。
    return {
        ...item,
        a:3
    }
});
```
==============
`map`方法体现的是数据不可变的思想。该思想认为所有的数据都是不能改变的，只能通过生成新的数据来达到修改的目的，因此直接对数组元素或对象属性进行操作的行为都是不可取的。这种思想其实有很多好处，最直接的就是避免了数据的隐式修改。`immutable.js`是实现数据不可变的一个库，可通过专属的API对引用类型进行操作，每次形成一个新的对象。
但具体到项目中还是要看团队的要求，都用或者都不用。单单局部使用是没有效果的。
如果使用了`React + Redux` 的技术栈，是比较推荐使用的
另外有一点，`forEach`和`map`还存在一个编程思想的区别，前者是命令式编程，后者是声明式编程，如果项目的风格是声明式的，比如`React`，那么后者显然更统一。