【问题标题】:Which functions in Array.prototype are pure function in JavascriptArray.prototype 中哪些函数是 Javascript 中的纯函数
【发布时间】:2021-01-06 17:23:26
【问题描述】:

我知道纯函数有以下一些规则。

  1. 没有副作用。
  2. 调用此函数时始终相同的输入和相同的输出。

有人可以帮我列出 ES2020 之前 Javascript 中的所有纯函数吗?

我知道 slice 是一个纯函数

Array.prototype.slice

【问题讨论】:

标签: javascript functional-programming


【解决方案1】:

数组静态方法

数组实例方法

* 这些接受回调参数。虽然该方法不会自身改变任何参数,但回调可能会。因此,从技术上讲,可以传递一个不纯的回调,从而使整个操作不纯。

** 返回一个迭代器。该操作是纯粹的,但使用迭代器不是。例如,如果您立即获得迭代器的所有值,或者获得一些值,然后在原地更改数组,然后继续从迭代器获取值,您可能会得到不同的结果。

*** 技术上纯粹是通过它的操作,但期望它接受的回调会有副作用。如果回调没有副作用,它可能不会是一个有用的操作。

【讨论】:

  • 声明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) 这样的函数,这个函数本身就是纯函数,因为没有可观察到的副作用。
猜你喜欢
  • 1970-01-01
  • 2015-03-05
  • 2023-03-31
  • 2020-01-06
  • 1970-01-01
  • 2011-07-02
  • 1970-01-01
  • 2019-10-05
  • 2022-06-11
相关资源
最近更新 更多