【发布时间】:2021-01-06 17:23:26
【问题描述】:
我知道纯函数有以下一些规则。
- 没有副作用。
- 调用此函数时始终相同的输入和相同的输出。
有人可以帮我列出 ES2020 之前 Javascript 中的所有纯函数吗?
我知道 slice 是一个纯函数
Array.prototype.slice
【问题讨论】:
标签: javascript functional-programming
我知道纯函数有以下一些规则。
有人可以帮我列出 ES2020 之前 Javascript 中的所有纯函数吗?
我知道 slice 是一个纯函数
Array.prototype.slice
【问题讨论】:
标签: javascript functional-programming
concatentries**every*filter*find*findIndex*flatflatMap()*forEach***includesindexOfjoinkeys**lastIndexOfmap*reduce*reduceRight*slicesome*values*** 这些接受回调参数。虽然该方法不会自身改变任何参数,但回调可能会。因此,从技术上讲,可以传递一个不纯的回调,从而使整个操作不纯。
** 返回一个迭代器。该操作是纯粹的,但使用迭代器不是。例如,如果您立即获得迭代器的所有值,或者获得一些值,然后在原地更改数组,然后继续从迭代器获取值,您可能会得到不同的结果。
*** 技术上纯粹是通过它的操作,但期望它接受的回调会有副作用。如果回调没有副作用,它可能不会是一个有用的操作。
【讨论】:
Array.from({length: x}, () => y)是new Array(x).fill(y)的纯粹替代品
new Array(x).fill(y) 中,使用new Array(x) 创建的数组是一个丢弃值,它是动态创建的,目的是用新值填充它。所以在我看来,它在某种程度上是纯粹的;它确实会发生变异,但是以一种可控的方式发生的,并且没有明显的副作用。不过,很高兴了解替代方案。
.fill 本身是不纯的,但构造 new Array(x).fill(y) 可以被认为是纯的。然而,它依赖于上下文,因为arr = new Array(x); /* ... */ arr.fill(y) 有可能在两者之间发生其他事情。当我们谈论纯度时,它通常是一个函数,而不是特定的代码行或这些代码的组合。所以,如果你有一个像 makeArray = (x, y) => new Array(x).fill(y) 这样的函数,这个函数本身就是纯函数,因为没有可观察到的副作用。