函数式编程中的不可变性

传统编程中,数据通常是可变的,这意味着在创建后可以随意修改和更改数据。让我们看一个例子:

let arr = [1, 2, 3];
arr.push(4); // `arr` 现在是 [1, 2, 3, 4]

然而,在函数式编程中,数据被视为不可变,这意味着一旦创建就无法更改。而是基于旧数据创建新数据。这有助于防止意外后果,并使程序更易于理解。

const arr = [1, 2, 3];
const newArr = [...arr, 4];
// `newArr` 是 [1, 2, 3, 4],`arr` 仍然是 [1, 2, 3]

如上例所示,原始数组没有被修改。相反,基于旧数组创建了一个新数组。原始数组仍然可用,并且如果需要,可以在程序的其他地方使用。

[!NOTE]

在这两个例子中,数组在技术上是可变的,无论是使用 let 还是 const 创建的。然而,在第一个例子中,数组通过使用 Array.prototype.push() 进行了变异,而在第二个例子中,数组没有被变异。这是因为 Array.prototype.push() 在原地变异数组,而扩展运算符 (...) 创建了一个新数组。