这是我参与8月更文挑战的第8天,活动详情查看:8月更文挑战
说明:文章部分内容及图片出自网络,如有侵权请与我本人联系(主页有公众号:小攻城狮学前端)
作者:小只前端攻城狮、 主页:小只前端攻城狮的主页、 来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
前言
接上一篇文章,我们来详细解读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;
});
//直接索引到当前元素去修改。
写作不易,「点赞」+「评论」 谢谢支持❤
感谢阅读,希望能对你有所帮助,文章若有错误或者侵权,可以在评论区留言或在我的主页添加公众号联系我。