发布于 2026-01-06 0 阅读
0

你需要了解 JavaScript 中的纯函数和非纯函数 DEV 的全球展示挑战赛,由 Mux 呈现:展示你的项目!

你需要了解 JavaScript 中的纯函数和非纯函数

由 Mux 主办的 DEV 全球展示挑战赛:展示你的项目!

本文将探讨纯函数和非纯函数的概念及其在 JavaScript 中的区别。让我们开始吧……


什么是函数?

在浩瀚的 JavaScript 世界中,函数是创建复杂交互式应用程序的基本组成部分。

函数最常见的用途之一是映射,它们接收输入值并生成相应的输出值。这使得数据转换和操作成为可能,而这对于创建动态用户体验至关重要。


什么是纯函数?

纯函数是指其返回值仅由参数决定,没有任何副作用的函数。例如,如果您在应用程序中n多次使用相同的参数调用该函数n,它将始终返回相同的值。纯函数不会修改任何外部状态,例如函数外部的变量或对象。它们仅使用输入参数进行计算并返回结果。

什么是纯函数

为了让你明白我的意思……

以下函数接受两个数字aa 和bb 作为输入参数,并返回它们的和。该函数是一个纯函数,因为对于相同的输入,它始终产生相同的输出,并且没有任何副作用。

function add(a, b) {
  return a + b;
}
Enter fullscreen mode Exit fullscreen mode

纯函数


什么是非纯函数?

不纯函数是指在给定相同输入的情况下,不同时间可能产生不同输出的函数。这是因为不纯函数会受到外部因素的影响,例如全局变量或其他函数的变化,这些因素会影响它们的行为和输出。

什么是非纯函数

以下函数每次调用时都会将外部变量 counter 的值加 1。这意味着它会产生副作用,并非纯函数。

let counter = 0;

function increment() {
  counter++;
  return counter;
}
Enter fullscreen mode Exit fullscreen mode

不纯函数


纯函数有什么用?

纯函数相比非纯函数具有以下几个优点:

1)可预测性:
由于纯函数对于给定的输入总是产生相同的输出,因此它们具有可预测性,易于理解。这使得测试和调试更加容易,并降低了代码中出现意外行为的可能性。

2) 可重用性:
纯函数是模块化和自包含的,这意味着它们可以在代码库的不同部分重复使用,而不会影响其他部分。这可以节省时间并减少需要编写的代码量。

3) 并行化:
由于纯函数不修改外部状态,因此可以并行执行,而无需担心竞态条件或其他同步问题。这可以带来更快、更高效的代码。


如何在JavaScript中创建纯函数?

1)纯函数仅使用输入参数。
纯函数应该只使用其输入参数进行计算并返回结果。它们不应该修改任何外部状态或依赖外部变量。

2) 避免副作用
纯函数不应该有任何副作用,例如修改外部变量或对象。它们应该只根据输入参数返回一个值。

3) 避免使用全局状态
纯函数应避免使用全局状态,例如全局变量或对象。这会降低代码的可预测性,并增加调试难度。

4) 返回值
纯函数应该始终根据输入参数返回一个值。它们不应该依赖外部变量或对象来生成输出。


纯函数与非纯函数

JavaScript 中的纯函数与非纯函数


JavaScript 中的内置纯函数:

Math.abs():返回一个数的绝对值。

Math.ceil():返回大于或等于给定数字的最小整数。

Math.floor():返回小于或等于给定数字的最大整数。

Math.max():返回一组数字中的最大值。

Math.min():返回一组数字中的最小值。

Math.round():返回给定数字最接近的整数。

Math.sqrt():返回给定数字的平方根。

parseInt():将字符串转换为整数。

parseFloat():将字符串转换为浮点数。

JSON.parse():将 JSON 字符串转换为 JavaScript 对象。

Array.prototype.concat():返回一个新数组,其中包含原始数组的元素以及作为参数传入的任何其他元素。

Array.prototype.slice():返回一个新数组,其中包含原始数组的一部分,由起始索引和结束索引指定。

Array.prototype.map():返回一个新数组,该数组是对原始数组的每个元素调用提供的函数的结果。

Array.prototype.filter():返回一个新数组,其中仅包含满足所提供的测试函数的原始数组的元素。

Array.prototype.reduce():返回一个值,该值是将提供的函数应用于数组的每个元素的结果。

String.prototype.toUpperCase():返回一个新字符串,其中包含全部大写的原始字符串。

String.prototype.toLowerCase():返回一个新字符串,其中包含全部小写的原始字符串。


JavaScript 中内置的非纯函数:

Math.random():返回一个介于 0 和 1 之间的随机数。此函数依赖于外部状态,即随机数生成器的当前状态,其输出每次调用时都会改变。

Date.now():返回当前时间戳,即自上次调用以来经过的毫秒数January 1, 1970。此函数依赖于外部状态(即当前时间),其输出每次调用都会改变。

console.log():向控制台写入一条消息。它不返回任何值,但会将信息记录到控制台。

setTimeout():在指定的延迟时间(以毫秒为单位)后执行函数。此函数会产生一个副作用,即调度一个函数在未来某个时间执行。

setInterval():按指定的时间间隔(以毫秒为单位)执行函数。此函数的副作用是会将函数安排为按固定时间间隔重复执行。

document.write():将HTML内容写入文档。它不返回任何值,但会产生修改文档的副作用。

`Math.floor(Math.random() * (max - min + 1) + min)`:返回给定范围内的随机整数。此函数依赖于外部状态,即随机数生成器的当前状态,其输出每次调用都会改变。

Math.pow():返回一个数的给定幂的结果。虽然此函数在数学上是纯函数,但可能会产生浮点舍入误差,从而导致其输出不纯。


❤ 动力:

做得更多


🍀支持

请考虑关注并订阅我们的频道以示支持。您的支持对我们至关重要,它将帮助我们继续创作更多精彩内容。提前感谢您的支持!

YouTube
Discord
GitHub

杜尔·达塞尔 #8740

文章来源:https://dev.to/codeofrelevancy/you-need-to-know-about-pure-functions-impure-functions-in-javascript-57