我简单总结一下:1.涉及改变数组的值时,最好不要尝试使用forEach。2.当数组元素为基本数据类型时,不可更改。3.当数组元素是引用类型时,可以改变一些方法。4.改变forEach中的数组,需要使用array[index]或item.xxx方法改变数组本身。forEach--用于调用数组的每个元素并将元素传递给回调函数,它不会改变数组本身。但是如果你想在循环中改变数组怎么办?不接受直接修改。比如下面的代码,表面上看没有错误,此刻item确实发生了变化,但实际上打印出最后的arr后,会发现arr并没有发生变化。图一,不过改成这样会生效。图2或者图3其实涉及到引用类型和基本数据类型的区别。首先要明确什么是基本数据和引用数据:基本数据类型和引用数据类型的区别主要是:基本数据类型有Number、String、Boolean、Null、Undefined、Symbol,指的是存储的简单数据段在堆栈中。数据大小确定;引用数据类型是object,指的是存放在堆内存中的对象,变量是存放在栈内存中的指针,每个空间的大小不同。1、当数组元素是引用类型数据时:当我们使用forEach时,每次看到的item并不是数组本身,而只是原数组对应的对象的地址值。这就是为什么我们使用item.XXX去修改一个特定的属性(如图2)或者arr[index](如图3)都可以成功,但是直接给item赋值(如图1)将失败。如果把数组比作房子,数组中的元素就相当于房子里的家具,forEach返回的item就相当于房子的地址。直接给item赋值的行为相当于给了一个新的地址。新地址指向新房子而不是旧房子(原来的数组)。你对新房子做的任何“装修”当然不会影响到老房子。而item.XXX或者arr[index]就相当于直接在房子里找了一个特定的家具进行更换,会对房子产生影响。2.当数组元素是基本数据类型时:基本数据没有地址,forEach只是给item赋值对应的值,就像下面的代码,无论你怎么修改item,都不会影响原来的数组a=2b=ab=3console.log(a)//2console.log(b)//3
