javascript - 返回值和将值传递给函数有什么区别?
问题描述
此刻,我无法理解传递数组元素之间的区别(在 forEach 方法中就是这种情况),因为它将每个数组元素传递给 console.log 并将其记录到控制台上,但它返回不明确的。
然而,在 array.map 的情况下,它也将数组元素传递给 console.log,但也会将每个数组元素返回给它所连接的变量,并创建一个新数组。
我不明白返回值(array.map)和将值传递给函数(array.forEach)之间的区别。
const fruits = ['mango', 'papaya', 'pineapple', 'apple']
const yummyFruits = fruits.forEach(fruit => {
console.log(fruit);
return fruit;
});
const numbers = [1, 2, 3, 4, 5];
const coolNumbers = numbers.map(number => {
console.log(number);
return number;
});
console.log(yummyFruits);
console.log(coolNumbers);
编辑
提议的副本没有解决我的问题。
解决方案
让我们从一些关于函数的理论开始。
所有功能都有两个基本方面:
它们可以返回一个值,供调用代码使用
他们可以在执行的过程中“做某事”,其中“某事”可能意味着执行任意代码(例如登录到控制台、更改 DOM、发送网络请求、更新本地或全局状态 - 可能性是无穷无尽的)。这种效果,即函数所做的与函数返回的内容(如果有的话)无关的事情,被称为“副作用”。
请注意,这两个方面的功能是完全独立的。一个函数可以在完全没有副作用的情况下返回一个值(这有时被称为“纯”函数),或者它可以在不返回任何东西的情况下执行一些副作用 - 或者它可以两者兼而有之。所有 3 个都经常出现在 Javascript 代码中。
现在让我们从这个角度forEach
来看map
。两者都是数组方法,它们将函数作为参数,并将该函数应用于数组的每个元素。请注意,如果该函数有任何副作用,则在这两种情况下都会执行这些副作用 - 因为副作用是函数仅通过执行而完成的事情。但是forEach
,map
就传递给方法的函数产生的任何返回值而言,其行为非常不同:
map
构建一个新数组,由参数函数在应用于原始数组的每个元素时的连续返回值组成。它返回这个新数组。- 但
forEach
完全忽略参数函数的任何返回值。因此,它不需要返回任何东西。(事实并非如此。)
换句话说,forEach
用于将函数应用于数组的每个元素,其中该函数仅由于其副作用而相关。而map
对于返回某些内容的函数,并通过获取函数结果的集合来构建新数组。它最常与纯函数一起使用——尽管没有规定禁止将其与具有副作用的函数一起使用。但如果你主要关心副作用,那么forEach
通常更自然。
请注意,这map
可以forEach
很容易地实现 - 通过初始化一个空数组,并使用forEach
一个函数,该函数将其函数参数应用于源数组的每个元素并将其推送到新元素上(然后在结尾)。
但总的来说,forEach
是为了使用副作用,并且map
是通过对每个元素应用纯函数来构建一个新数组。
推荐阅读
- amazon-web-services - AWS Kinesis Firehose 无法将数据索引到 AWS Elasticsearch
- java - Kotlin 嵌套多泛型类型类到 Java 嵌套原始类型
- javascript - 我如何检查 KendoTreeview 有孩子
- r - R - 如何将 as.POSIX 应用于具有大量小数位的时间
- haskell - 如何不传递在另一个函数中返回布尔值的函数?
- vim - 如何查询搜索中的最高位?
- r - 在 R 中,有没有办法在只提取部分列名的同时收集数据框?
- sql - 如何在子查询中聚合案例表达式?
- javascript - 字符串化/解析的优化
- reactjs - React Datepicker 仅值日期格式