乐趣区

关于javascript:JS数组中-forEach-和-map-的区别

译者:前端小智
作者:Ashish Lahoti
起源:odingnconcepts

点赞再看 ,微信搜寻【大迁世界】 关注这个没有大厂背景,但有着一股向上踊跃心态人。本文 GitHub https://github.com/qq44924588… 上曾经收录,文章的已分类,也整顿了很多我的文档,和教程材料。**

双 12 阿里服务器 27 块,通用点击这里购买能够找我返现 30,等于 27 块就能买到了,只限新用户,能够用家人的手机号购买!

明天咱们来看一下 Array 中 Array.forEach()Array.map()办法之间的区别。

forEach()map() 办法通常用于遍历 Array 元素,但简直没有区别,咱们来一一介绍。

1. 返回值

forEach()办法返回 undefined,而map() 返回一个蕴含已转换元素的新数组。

const numbers = [1, 2, 3, 4, 5];

// 应用 forEach()
const squareUsingForEach = [];
numbers.forEach(x => squareUsingForEach.push(x*x));

// 应用 map()
const squareUsingMap = numbers.map(x => x*x);

console.log(squareUsingForEach); // [1, 4, 9, 16, 25]
console.log(squareUsingMap);     // [1, 4, 9, 16, 25]

因为 forEach() 返回 undefined,所以咱们须要传递一个空数组来创立一个新的转换后的数组。map() 办法不存在这样的问题,它间接返回新的转换后的数组。在这种状况下,倡议应用 map() 办法。

2. 链接其余办法

map()办法输入能够与其余办法 (如reduce()sort()filter()) 链接在一起,以便在一条语句中执行多个操作。

另一方面,forEach()是一个终端办法,这意味着它不能与其余办法链接,因为它返回undefined

咱们应用以下两种办法找出数组中每个元素的平方和:

onst numbers = [1, 2, 3, 4, 5];

// 应用 forEach()
const squareUsingForEach = []
let sumOfSquareUsingForEach = 0;
numbers.forEach(x => squareUsingForEach.push(x*x));
squareUsingForEach.forEach(square => sumOfSquareUsingForEach += square);

// 应用 map()
const sumOfSquareUsingMap = numbers.map(x => x*x).reduce((total, value) => total + value)
;

console.log(sumOfSquareUsingForEach); // 55
console.log(sumOfSquareUsingMap);     // 55

当须要多个操作时,应用 forEach() 办法是一项十分乏味的工作。咱们能够在这种状况下应用 map() 办法。

3. 性能

// Array:
var numbers = [];
for (var i = 0; i < 1000000; i++) {numbers.push(Math.floor((Math.random() * 1000) + 1));
}

// 1. forEach()
console.time("forEach");
const squareUsingForEach = [];
numbers.forEach(x => squareUsingForEach.push(x*x));
console.timeEnd("forEach");

// 2. map()
console.time("map");
const squareUsingMap = numbers.map(x => x*x);
console.timeEnd("map");

这是在 MacBook Pro 的 Google Chrome v83.0.4103.106(64 位)上运行上述代码后的后果。倡议复制下面的代码,而后在本人控制台中尝试一下。

forEach: 26.596923828125ms
map:     21.97998046875ms

显然,map()办法比 forEach() 转换元素要好。

4. 中断遍历

这两种办法都不能用 break 中断,否则会引发异样:

const numbers = [1, 2, 3, 4, 5];

// break; inside forEach()
const squareUsingForEach = [];
numbers.forEach(x => {if(x == 3) break; // <- SyntaxError 
  squareUsingForEach.push(x*x);
});

// break; inside map()
const squareUsingMap = numbers.map(x => {if(x == 3) break; // <- SyntaxError 
  return x*x;
});

下面代码会抛出 SyntaxError

ⓧ Uncaught SyntaxError: Illegal break statement

如果须要中断遍历,则应应用简略的 for 循环或 for-of/for-in 循环。

const numbers = [1, 2, 3, 4, 5];

// break; inside for-of loop
const squareUsingForEach = [];
for(x of numbers){if(x == 3) break;
  squareUsingForEach.push(x*x);
};

console.log(squareUsingForEach); // [1, 4]

5. 最初

倡议应用 map() 转换数组的元素,因为它语法短,可链接且性能更好。

如果不想返回的数组或不转换数组的元素,则应用forEach() 办法。

最初,如果要基于某种条件进行或中断数组的便当,则应应用简略的 for 循环或 for-of / for-in 循环。


代码部署后可能存在的 BUG 没法实时晓得,预先为了解决这些 BUG,花了大量的工夫进行 log 调试,这边顺便给大家举荐一个好用的 BUG 监控工具 Fundebug。

原文:https://codingnconcepts.com/j…

交换

文章每周继续更新,能够微信搜寻「大迁世界」第一工夫浏览和催更(比博客早一到两篇哟),本文 GitHub https://github.com/qq449245884/xiaozhi 曾经收录,整顿了很多我的文档,欢送 Star 和欠缺,大家面试能够参照考点温习,另外关注公众号,后盾回复 福利,即可看到福利,你懂的。

退出移动版