🚀详解JavaScript系列之数组(八)

503 阅读3分钟

image.png


这是我参与8月更文挑战的第8天,活动详情查看:8月更文挑战


说明:文章部分内容及图片出自网络,如有侵权请与我本人联系(主页有公众号:小攻城狮学前端)

作者:小只前端攻城狮、 主页:小只前端攻城狮的主页、 来源:掘金

GitHub:P-J27、 CSDN:PJ想做前端攻城狮

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


前言

接上一篇文章,我们来详细解读js数组的内容,本篇幅讲述“数组的遍历(3)”,上一篇传送门


forEach() 遍历

forEach()方法需要一个函数作为参数。这种函数,是由我们创建但是不由我们调用的,我们称为回调函数。数组中有几个元素,该回调函数就会执行几次。

回调函数中传递三个参数:

  • 第一个参数,就是当前正在遍历的元素
  • 第二个参数,就是当前正在遍历的元素的索引
  • 第三个参数,就是正在遍历的数组

示例

let myArr = ['小只前端攻城狮', 'PJ想做前端攻城狮', 'CSDN:https://blog.csdn.net/weixin_43745075'];
myArr.forEach((item, index, arr) => {
    console.log('item:' + item);
    console.log('index:' + index);
    console.log('arr:' + JSON.stringify(arr));
    console.log('----------');
});
​
/*
item:小只前端攻城狮
index:0
arr:["小只前端攻城狮","PJ想做前端攻城狮","CSDN:https://blog.csdn.net/weixin_43745075"]
----------
item:PJ想做前端攻城狮
index:1
arr:["小只前端攻城狮","PJ想做前端攻城狮","CSDN:https://blog.csdn.net/weixin_43745075"]
----------
item:CSDN:https://blog.csdn.net/weixin_43745075
index:2
arr:["小只前端攻城狮","PJ想做前端攻城狮","CSDN:https://blog.csdn.net/weixin_43745075"]
----------
*/

注意:forEach() 没有返回值。也可以理解成:forEach() 的返回值是 undefined。如果你尝试 tempArry = myArr.forEach()这种方式来接收,是达不到效果的。

forEach() 能不能改变原数组?

关于这个问题,大部分人会搞错。我们来看看下面的代码。正常来说,我们一般不用forEach来改变原数组forEach用于我们纯粹的遍历操作。但我们知道回调函数中有三个参数,其中包含index和arr,这样我们也能实现改变原数组。所以我们常说的能不能改变是说我们会不会用它去改变,而不是可不可以改变。

1、数组的元素是基本数据类型:(无法改变原数组)


let numArr = [1, 2, 3];
​
numArr.forEach((item) => {
    item = item * 2;
});
console.log(JSON.stringify(numArr)); // 打印结果:[1, 2, 3]

上面这段代码,你可要看仔细了,打印结果是 [1, 2, 3],不是 [2, 4, 6]

2、数组的元素是引用数据类型:(直接修改整个元素对象时,无法改变原数组)

let objArr = [
    { name: '小只前端攻城狮', age: 20 },
    { name: 'PJ想做前端攻城狮', age: 30 },
];

objArr.forEach((item) => {
    item = {
        name: '秋秋',
        age: '29',
    };
});
console.log(JSON.stringify(objArr)); 
// 打印结果:
[{"name":"小只前端攻城狮","age":20},
 {"name":"PJ想做前端攻城狮","age":30}]

3、数组的元素是引用数据类型:(修改元素对象里的某个属性时,可以改变原数组)

let objArr = [
    { name: '小只前端攻城狮', age: 28 },
    { name: 'PJ想做前端攻城狮', age: 30 },
];
​
objArr.forEach((item) => {
    item.name = '秋秋';
});
console.log(JSON.stringify(objArr)); 
// 打印结果:
[{"name":"秋秋","age":28},{"name":"秋秋","age":30}]

分析:是不是觉得很奇怪,其实很容易理解,每当我们遍历一个元素时,而回调函数的三个参数的实参从何而来的呢,后两个参数就不说了,他们本就可以用来改变数组,而item实际上对js新定义了一个变量当做实参,而变量的值是对当前元数的一个浅拷贝,由于对象的浅拷贝只是引用关系的拷贝,所以通过成员访问可以改变原对象的属性。

4、forEach() 通过参数 2、参数 3 修改原数组:(标准做法)

let numArr = [1, 2, 3];
numArr.forEach((item, index, arr) => {
    arr[index] = arr[index] * 2;
});
//直接索引到当前元素去修改。

写作不易,「点赞」+「评论」 谢谢支持❤

感谢阅读,希望能对你有所帮助,文章若有错误或者侵权,可以在评论区留言或在我的主页添加公众号联系我。