《JavaScript应用程序设计》一一2.14 函数式编程

简介:

本节书摘来华章计算机出版社《JavaScript应用程序设计》一书中的第2章,第2.14节,作者:Eric Elliott 更多章节内容可以访问云栖社区“华章计算机”公众号查看。

2.14 函数式编程

函数式编程是一种使用高阶函数(非对象和数据)来进行代码组织和复用的编程风格。高阶函数将普通函数视为数据或参数,或将函数作为其返回结果。高阶函数在JavaScript中有多种用途,它是非常强大的代码重用工具,来看下面的示例。
函数式编程常常用于将算法从数据类型中抽象出来,这样的好处是可以减少算法复用时为支持多种数据类型而导致的代码冗余。如果算法没有经过抽象,那么在操作集合时,你将需要为集合中每一种不同的数据类型分别构建相应的处理函数,而这些函数间的区别仅仅只是传参类型略有不同而已,这类问题在多数应用中都存在。
注意: 你有一箩筐函数,它们除了在操作对象的数据类型上有差异外,其他方面几乎没什么不同。让我来告诉你,你已经违反了软件设计中最为重要的一个原则:DRY(不要重复造轮子),这个例子是一个典型的“代码异味”。
举例来说,假设你需要对两个商品列表按照价格高低进行排序,其中一个商品列表是演唱会门票,价格字段为ticketPrice,另一个为书本,价格字段为price。
这里你可以选择将两个字段合并为一个更为通用的字段,随后再搭配一个处理该字段类型(鸭子类型)的通用函数,不过这种代码重构的方式有些怪异。
相反,你可以为排序时的比较操作传入一个函数:

var shows = [
    {
      artist: 'Kreap',
      city: 'Melbourne',
      ticketPrice: '40'
    },
    {
      artist: 'DJ EQ',
      city: 'Paris',
      ticketPrice: '38'
    },
    {
      artist: 'Treasure Fingers',
      city: 'London',
      ticketPrice: '60'
    }
  ],
  books = [
    {
      title: 'How to DJ Proper',
      price: '18'
    },
    {
      title: 'Music Marketing for Dummies',
      price: '26'
    },
    {
      title: 'Turntablism for Beginners',
      price: '15'
    }
  ];

test('Datatype abstraction', function () {
  var sortedShows = shows.sort(function (a, b) {
      return a.ticketPrice < b.ticketPrice;
    }),
    sortedBooks = books.sort(function (a, b) {
      return a.price < b.price;
    });
  ok(sortedShows[0].ticketPrice >
    sortedShows[2].ticketPrice,
    'Shows sorted correctly.');
  ok(sortedBooks[0].price >
    sortedBooks[1].price,
    'Books sorted correctly.');
});

高价函数常用来从算法实现中抽象出迭代器模板,在前一个示例中你也注意到了,实际的迭代操作是由数组内置方法Array.prototype.sort()来完成的,你甚至不用去手写一个for循环。传统的迭代方式大致是这样:

test('Traditional for loop', function () {
  var i,
    length = books.length;

  for (i = 0; i < length; i++) {
    books[i].category = 'music';
  }

  ok(books[0].category === 'music',
    'Books have categories.');
});

在对集合中的元素循环遍历处理方面,JavaScript提供了不少将函数作为参数传入的迭代器方法,其中最为常见数组迭代器莫过于forEach()方法。假设你想为列表中的每一本书都添加category字段,又不想手写循环去跟踪那些临时索引变量,forEach()方法可以帮到你,就像下面这样:

test('Iterator abstraction', function () {
  books.forEach(function (book) {
    book.category = 'music';
  });

  ok(books[0].category === 'music',
    'Books have categories.');
});

高价函数另一个使用场景是偏函数与函数加里化。

相关文章
|
前端开发 JavaScript 数据处理
深入学习JavaScript ES8函数式编程:特性与实践指南
深入学习JavaScript ES8函数式编程:特性与实践指南
81 0
|
4月前
|
存储 JavaScript 前端开发
JavaScript——函数式编程Functor(函子)
JavaScript——函数式编程Functor(函子)
26 0
|
6月前
|
前端开发 JavaScript 开发者
函数式编程在JavaScript中的应用
【6月更文挑战第10天】本文探讨了函数式编程在JavaScript中的应用,介绍了函数式编程的基本概念,如纯函数和不可变数据。文中通过示例展示了高阶函数、不可变数据的使用,以及如何编写纯函数。此外,还讨论了函数组合和柯里化技术,它们能提升代码的灵活性和可重用性。掌握这些函数式编程技术能帮助开发者编写更简洁、可预测的JavaScript代码。
|
7月前
|
JavaScript 前端开发
JavaScript 的数组方法 map()、filter() 和 reduce() 提供了函数式编程处理元素的方式
【5月更文挑战第11天】JavaScript 的数组方法 map()、filter() 和 reduce() 提供了函数式编程处理元素的方式。map() 用于创建新数组,其中元素是原数组元素经过指定函数转换后的结果;filter() 则筛选出通过特定条件的元素生成新数组;reduce() 将数组元素累计为单一值。这三个方法使代码更简洁易读,例如:map() 可用于数组元素乘以 2,filter() 用于选取偶数,reduce() 计算数组元素之和。
50 2
|
7月前
|
JavaScript 前端开发 测试技术
JavaScript中的函数式编程:纯函数与高阶函数的概念解析
【4月更文挑战第22天】了解JavaScript中的函数式编程,关键在于纯函数和高阶函数。纯函数有确定输出和无副作用,利于预测、测试和维护。例如,`add(a, b)`函数即为纯函数。高阶函数接受或返回函数,用于抽象、复用和组合,如`map`、`filter`。函数式编程能提升代码可读性、可维护性和测试性,帮助构建高效应用。
|
7月前
|
JavaScript 前端开发 索引
JavaScript函数式编程【进阶】
JavaScript函数式编程【进阶】
59 1
|
7月前
|
存储 JavaScript 前端开发
JavaScript函数式编程[入门]
JavaScript函数式编程[入门]
56 1
|
7月前
|
前端开发 JavaScript 数据处理
深入学习JavaScript ES8函数式编程:特性与实践指南
深入学习JavaScript ES8函数式编程:特性与实践指南
118 0
|
缓存 JavaScript 前端开发
带你读《现代Javascript高级教程》十四、JavaScript函数式编程(1)
带你读《现代Javascript高级教程》十四、JavaScript函数式编程(1)
|
JavaScript 前端开发 测试技术
带你读《现代Javascript高级教程》十四、JavaScript函数式编程(2)
带你读《现代Javascript高级教程》十四、JavaScript函数式编程(2)