JavaScript中的forEach到底能不能改变原数组?

134 阅读2分钟

前言

最近和一些小伙伴一起讨论的时候,无意间说到forEach,然后就谈到它能不能修改原数组的问题,有的说可以,另外一个人说不行的,两个都很理直气壮,好像都有理。那究竟forEach能不能改变原数组呢?今天我们就来举例子说明一下。举例分两种情况说明,一种是数组里的元素是基本数据类型的,另一种就是引用数据类型的。

基本数据类型

const array1=[1,2,3,4,5]
array1.forEach(item=>{
  item=item+1
})
console.log(array1); //[1, 2, 3, 4, 5]

我们可以发现对数组元素遍历操作之后数组的值依然是之前的没有发生变化。所以是基本数据类型的数组时,是没法直接改变元素的值的,注意我这里说的是 “直接”,那意思就是还是有办法改变的,请看下面:

array1.forEach((item,index)=>{
  array1[index]=item+1
})
console.log(array1); //[2, 3, 4, 5, 6]

我们可以通过回调的第二个参数获取到他的index,然后对原数组进行操作,这样子是可以改变原数组的。

但是,是没法直接改变原数组的!

引用数据类型

下面我们再来看看第二种类型是什么情况:

const array2=[
  {
    name:"winy"
  },
  {
    name:"bob"
  },
]

array2.forEach(item=>{
  item ={
    name:"cristal"
  }
})
console.log(array2);
/*[
  {
    name:"winy"
  },
  {
    name:"bob"
  },
]*/

我们发现如果直接改变数组里的整个对象是不会生效的,改变不了原来的值。

array2.forEach(item=>{
  item.name="Mr . " + item.name
})
console.log(array2);
/*[
{
  name: 'Mr . winy'
},
{
  name: 'Mr . bob'
},
]*/

但是如果改变对象里面的属性,就可以生效。

总结

所以,综上可以看出,当数组元素是基本类型的时候,是没法直接改变元素的值,但是可以通过回调函数的第二个参数index来直接对原数组进行操作,当数组元素是引用类型的时候,不能改变整个对象,但是可以改变对象属性的值。

以上就是我对forEach的一些理解,如果有不足和遗漏的地方,欢迎大家指出!谢谢大家!