在 JavaScript 的世界里,数组
是处理数据集合的重要工具。而纯函数
,作为一种编程范式,它不改变输入数据,也不依赖外部状态,只通过输入参数决定输出结果。这样的函数易于测试、易于理解,也更易于维护。
什么叫纯函数
纯函数
(Pure Function)是函数式编程中的一个基本概念。它具有以下两个主要特点:
- 无副作用(No Side Effects):纯函数在执行过程中不会对外部环境产生影响,即不会改变外部状态,也不会产生外部可见的变化,如修改全局变量、修改输入参数、输出到控制台、抛出异常、进行 I/O 操作等。
- 可预测性(Predictable):对于相同的输入,纯函数总是返回相同的输出。这意味着函数的行为不依赖于程序中的状态变化,每次调用时,只要输入参数相同,输出的结果也必然相同。
数组新增纯函数API
在 JavaScript
中,许多数组方法都是纯函数,例如:map
、filter
、slice
等,它们不会改变原始数组,而是返回一个新的数组。JavaScript 为数组操作带来了几个新的纯函数 API,它们是Array.toSorted()
、Array.toReversed()
、Array.toSpliced()
以及Array.with()
。
这些新方法不仅保持了纯函数的特性,还提供了更多灵活的操作方式。
-
Array.toSorted()
Array.toSorted()
是sort()
方法的纯函数版本。它返回一个新数组,其元素按升序排列,而原数组保持不变。这个方法接受一个可选的比较函数,允许你自定义排序逻辑。const numbers = [5, 3, 2, 8, 1]; const sortedNumbers = numbers.toSorted(); console.log(sortedNumbers); // [1, 2, 3, 5, 8] console.log(numbers); // [5, 3, 2, 8, 1] 原数组未改变
-
Array.toReversed()
Array.toReversed()
是reverse()
方法的纯函数版本。它返回一个新数组,其元素顺序与原数组相反,原数组同样保持不变。const items = [1, 2, 3, 4]; const reversedItems = items.toReversed(); console.log(reversedItems); // [4, 3, 2, 1] console.log(items); // [1, 2, 3, 4] 原数组未改变
-
Array.toSpliced()
Array.toSpliced()
是splice()
方法的纯函数版本。它返回一个新数组,根据指定的索引和删除数量,以及可选的添加元素,来生成新数组。原数组同样不会受到影响。const fruits = ["Banana", "Orange", "Apple", "Mango"]; const newFruits = fruits.toSpliced(1, 1, "Lemon"); console.log(newFruits); // ["Banana", "Lemon", "Apple", "Mango"] console.log(fruits); // ["Banana", "Orange", "Apple", "Mango"] 原数组未改变
-
Array.with()
Array.with()
是一个新的纯函数,用于替换数组中指定索引处的元素。它返回一个新数组,其中指定索引处的元素被替换为新值,而原数组保持不变。const arr = [1, 2, 3, 4, 5]; const newArr = arr.with(2, 6); console.log(newArr); // [1, 2, 6, 4, 5] console.log(arr); // [1, 2, 3, 4, 5] 原数组未改变
这些新的纯函数 API
不仅丰富了 JavaScript 的数组操作方法,还使得代码更加简洁和安全。它们避免了修改原始数据,减少了因数据变更带来的潜在错误
,是现代 JavaScript 开发中不可或缺的工具。通过使用这些纯函数,我们可以编写出更加清晰、可维护的代码,同时保持数据的不变性,这是函数式编程的核心原则之一。