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

通过函数式编程提升你的 JavaScript 技能!DEV 的全球展示挑战赛由 Mux 呈现:展示你的项目!

通过函数式编程提升你的 JavaScript 技能

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

如果你想写出更好的 JavaScript 代码,函数式编程 (FP) 是最有效的技巧之一。它并不比 JavaScript 语言本身难——别听别人瞎说。本文面向编程初学者,本系列文章将陆续发布。

使用纯函数

纯函数是指

  1. 除了提供的参数之外,不会访问任何其他内容。
  2. 它不会修改函数外部的任何内容。它可能会返回基于参数的计算值。这意味着,当输入相同值时,它将始终返回相同的输出。

纯函数示例

const calculateArea = radius => 3.14 * radius * radius;

map()用于for/forEach数组转换时,请改用其他方法。

(你可能已经在这么做了)

使用以下方法处理数组并将其转换为新数组:for/forEach

const nums = [1,2,3,4,5,6];
const doubles = [];
for(let i = 0; i < nums.length; i++){
  doubles.push(nums[i] * 2);
}
// nums.forEach(item => doubles.push(item * 2)); // foreach version
console.log(doubles)

相反,你应该使用map()函数(JavaScript 中内置的函数)。

const nums = [1,2,3,4,5,6];
const doubles = nums.map(item => item * 2);
console.log(doubles)

为什么使用这种方法map()而不是上述方法?

  • 这段代码几乎是人类可读的(“用函数 x 将此数组映射到该数组”),很容易理解。
  • 它界面简洁,按键次数少,因此潜在的错误也更少。

使用reduce()`for` 循环代替 `for` 循环进行加法计算。

如果你想计算某个取决于数组中每个元素的值的数值,请使用reduce()函数。例如,你需要将数组中每个元素的值相加。

for/forEach方法:

const array1 = [1, 2, 3, 4];
let sum = 0;
for(let i=0; i< array1.length; i++){
  sum+=array1[i];
}
// array1.forEach(item => sum+= item); //forEach version

// 1 + 2 + 3 + 4
console.log(sum);
const array1 = [1, 2, 3, 4];
const sum = array1.reduce((sum, current) => sum+current, 0);

// 1 + 2 + 3 + 4
console.log(sum);

为什么使用这种方法reduce()而不是上述方法?

  • 比 for 循环更少样板代码
  • 一个常见的结构,读起来更简洁。
  • 可以与其他数组函数(例如 map)链接使用:array1.map(i => i*2).reduce((sum, current) => sum+current)

使用 filter() 方法进行数组过滤操作:

使用 for 循环筛选数组中的偶数:

const array1 = [1, 2, 3, 4];

const evenArray1 = [];
for(let i = 0; i<array1.length; i++){
  if(array1[i] % 2 === 0){
    evenArray1.push(array1[i]); //copy only even elements
  }
}
console.log(evenArray1);

用户filter()方法:

const array1 = [1, 2, 3, 4];

const evenArray1 = array1.filter(item => item % 2 === 0);
console.log(evenArray1);

使用for 循环every()代替some()手动搜索

检查数组中的所有元素是否都满足某些条件(甚至)

const array1 = [2,4,8];

let isAllEven = true;
for(let i = 0; i<array1.length; i++){
  if(array1[i] % 2 !== 0){
    isAllEven = false;
    break;
  }
}
console.log(isAllEven);

用途every()相同:

const array1 = [2,4,8, 3];

let isAllEven = array1.every(item => item % 2 === 0)
console.log(isAllEven);

检查数组中是否至少有一个元素满足某些条件(甚至)

const array1 = [1, 3];

let isAtleastOneEven = false;
for(let i = 0; i<array1.length; i++){
  if(array1[i] % 2 === 0){
    isAtleastOneEven = true;
    break;
  }
}
console.log(isAtleastOneEven);

用途some()相同:

const array1 = [1, 2, 3];

let isAtleastOneEven =  array1.some(item => item % 2 ===0)
console.log(isAtleastOneEven);

使用偏函数从现有函数创建新函数bind()

你可以从现有函数推导出新函数。例如,你有一个计算数字幂的幂函数。

const power = (p, num) => num ** p;

您可以创建一个新函数square()cube()该函数可以使用现有函数。

const square = power.bind(null, 2);
const cube = power.bind(null, 3);

console.log(square(5))  // 25
console.log(cube(5))  // 125

性能说明:请注意,for 循环始终比其他类似函数更快map()。对于少量项目(例如几百个以内),两者的性能相近;但对于大量项目,您可能需要考虑使用 for 循环。

下一篇文章我们将讨论一些高级函数式编程概念。谢谢!

文章来源:https://dev.to/nitinja/improve-your-javascript-with-function-programming-3jjb