数组中map遍历会改变原数组吗?

提到map用法,很多人想到forEach,那么这两种方法的区别是什么?会有人说,forEach会改变原数组;map不会改变原数组,返回一个新数组。事实是这样的吗?答案不是,这种说法不准确,是有条件的。
1、当数组的值为基本类型的时候,map遍历数组,当对数组中的值做处理的时候,的确不会改变原数组。
let a = [1,2,3]
b=a.map(item => { item = item+1 })
console.log(a) // [1,2,3]
console.log(b) // [2,3,4]
2、当数组是一个对象数组的时候,我们发现,map遍历数组,通过打印发现原数组发生改变了
在这里插入图片描述
在这里插入图片描述
有什么办法不让map改变对象数组这样的原数组?我们可以这样写。
在这里插入图片描述
在这里插入图片描述
经过打印,发现原数组没有被改变。为什么会这样呢?我们对对象数组中的item值,通过扩展运算符…深拷贝给obj,不在原数组中直接操作item的值,而是操作obj中值,这样原数组就不会改变了。注意:扩展运算符只对对象的第一层是深拷贝!!!所以当有人问你,扩展运算符是深拷贝还是浅拷贝的时候,应该分情况回答。这里不作详细解释。