返回
函数式编程利器:forEach()与map()的解析与妙用
前端
2023-12-18 16:42:53
一、forEach()与map()的源码解析
要理解forEach()和map()的内部实现机制,我们首先需要查看它们的源码。
1. forEach()源码解析
Array.prototype.forEach = function(callbackfn) {
for (var i = 0; i < this.length; i++) {
callbackfn(this[i], i, this);
}
};
从源码中可以看出,forEach()方法接收一个回调函数callbackfn作为参数,它对数组中的每个元素依次执行该回调函数。回调函数接收三个参数:当前元素、当前元素的索引以及数组本身。
2. map()源码解析
Array.prototype.map = function(callbackfn) {
var mappedArray = [];
for (var i = 0; i < this.length; i++) {
mappedArray.push(callbackfn(this[i], i, this));
}
return mappedArray;
};
与forEach()类似,map()方法也接收一个回调函数callbackfn作为参数。不同之处在于,map()方法返回一个新的数组,其中包含了对原数组每个元素应用回调函数后的结果。
二、forEach()与map()的相同点与不同点
1. 相同点
- forEach()和map()都是数组方法,用于遍历数组中的元素。
- 它们都接收一个回调函数作为参数,该回调函数对数组中的每个元素执行某种操作。
- 它们都是惰性求值的,这意味着它们不会立即执行回调函数,而是在需要时才执行。
2. 不同点
- forEach()不返回任何值,而map()返回一个新的数组,其中包含了对原数组每个元素应用回调函数后的结果。
- forEach()主要用于对数组中的每个元素执行某种操作,而map()主要用于对数组中的每个元素进行转换。
三、forEach()与map()的实际案例
1. 使用forEach()为数组中的每个元素添加属性
const numbers = [1, 2, 3, 4, 5];
numbers.forEach((number, index) => {
number. doubled = number * 2;
});
console.log(numbers); // [ { doubled: 2 }, { doubled: 4 }, { doubled: 6 }, { doubled: 8 }, { doubled: 10 } ]
2. 使用map()遇到空缺比较
const data = [
{ name: 'John', age: 25 },
{ name: 'Mary', age: 30 },
{ name: 'Bob', age: undefined },
{ name: 'Alice', age: 22 }
];
const filteredData = data.map((person) => {
if (person.age) {
return person;
} else {
return { name: person.name, age: 'Unknown' };
}
});
console.log(filteredData); // [ { name: 'John', age: 25 }, { name: 'Mary', age: 30 }, { name: 'Bob', age: 'Unknown' }, { name: 'Alice', age: 22 } ]
四、结语
forEach()和map()是JavaScript中非常有用的数组方法,它们可以帮助我们轻松地遍历数组中的元素并对其执行各种操作。通过理解它们的源码、相同点和不同点,我们可以更好地掌握它们的用法并将其应用到实际开发中。