你需要了解 JavaScript 中的纯函数和非纯函数
由 Mux 主办的 DEV 全球展示挑战赛:展示你的项目!
本文将探讨纯函数和非纯函数的概念及其在 JavaScript 中的区别。让我们开始吧……
什么是函数?
在浩瀚的 JavaScript 世界中,函数是创建复杂交互式应用程序的基本组成部分。
函数最常见的用途之一是映射,它们接收输入值并生成相应的输出值。这使得数据转换和操作成为可能,而这对于创建动态用户体验至关重要。
什么是纯函数?
纯函数是指其返回值仅由参数决定,没有任何副作用的函数。例如,如果您在应用程序中n多次使用相同的参数调用该函数n,它将始终返回相同的值。纯函数不会修改任何外部状态,例如函数外部的变量或对象。它们仅使用输入参数进行计算并返回结果。
为了让你明白我的意思……
以下函数接受两个数字aa 和bb 作为输入参数,并返回它们的和。该函数是一个纯函数,因为对于相同的输入,它始终产生相同的输出,并且没有任何副作用。
function add(a, b) {
return a + b;
}
什么是非纯函数?
不纯函数是指在给定相同输入的情况下,不同时间可能产生不同输出的函数。这是因为不纯函数会受到外部因素的影响,例如全局变量或其他函数的变化,这些因素会影响它们的行为和输出。
以下函数每次调用时都会将外部变量 counter 的值加 1。这意味着它会产生副作用,并非纯函数。
let counter = 0;
function increment() {
counter++;
return counter;
}
纯函数有什么用?
纯函数相比非纯函数具有以下几个优点:
1)可预测性:
由于纯函数对于给定的输入总是产生相同的输出,因此它们具有可预测性,易于理解。这使得测试和调试更加容易,并降低了代码中出现意外行为的可能性。
2) 可重用性:
纯函数是模块化和自包含的,这意味着它们可以在代码库的不同部分重复使用,而不会影响其他部分。这可以节省时间并减少需要编写的代码量。
3) 并行化:
由于纯函数不修改外部状态,因此可以并行执行,而无需担心竞态条件或其他同步问题。这可以带来更快、更高效的代码。
如何在JavaScript中创建纯函数?
1)纯函数仅使用输入参数。
纯函数应该只使用其输入参数进行计算并返回结果。它们不应该修改任何外部状态或依赖外部变量。
2) 避免副作用
纯函数不应该有任何副作用,例如修改外部变量或对象。它们应该只根据输入参数返回一个值。
3) 避免使用全局状态
纯函数应避免使用全局状态,例如全局变量或对象。这会降低代码的可预测性,并增加调试难度。
4) 返回值
纯函数应该始终根据输入参数返回一个值。它们不应该依赖外部变量或对象来生成输出。
纯函数与非纯函数
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():返回一个数的给定幂的结果。虽然此函数在数学上是纯函数,但可能会产生浮点舍入误差,从而导致其输出不纯。
❤ 动力:
🍀支持
请考虑关注并订阅我们的频道以示支持。您的支持对我们至关重要,它将帮助我们继续创作更多精彩内容。提前感谢您的支持!
文章来源:https://dev.to/codeofrelevancy/you-need-to-know-about-pure-functions-impure-functions-in-javascript-57



