JavaScript 中的函数式

前言

JavaScript 好学吗?首先我们知道 JavaScript 是前端开发中非常核心的技术,单独从 JavaScript 在前端开发中,页面数据交互以及页面动态效果层面来讲,JS 技术并不难,甚至可以说 JS 和 HTML/CSS 一样是非常简单的语言。但是在JS相关的拓展功能的使用层面,真正能非常好的运用 JS 则需要大家不断地去探索。

什么是JS

JavaScript 是一种直译式的脚本语言,它是一种动态类型、弱类型、基于原型的语言,内置支持类型。它的解释器被成为是 JavaScript 引擎,是浏览器的一部分,现在被广泛地用于客户端。JavaScript 基于原型编程、多范式的动态脚本语言,并且支持面向对象、命令式和声明式风格。

JS中的函数式编程

函数式编程是一种编程范式,强调使用纯函数、不可变数据和函数组合来构建程序。我个人非常喜欢函数式编程,心血来潮总结一下 JavaScript 里的函数式用法。

1. 纯函数(Pure Functions)

纯函数是指不依赖于外部状态且不产生副作用的函数。给定相同的输入,纯函数总是返回相同的输出。

// 纯函数
function add(a, b) {
    return a + b;
}

// 非纯函数,依赖于外部状态
let counter = 0;
function increment() {
    counter++;
    return counter;
}

2. 不可变性(Immutability)

不可变性是指数据一旦创建就不能被修改。在函数式编程中,通常通过创建新的数据而不是修改现有数据来实现不可变性。

// 使用不可变性
const arr = [1, 2, 3];
const newArr = [...arr, 4]; // 创建新数组,而不是修改原数组

3. 高阶函数(Higher-Order Functions)

高阶函数是指接受一个或多个函数作为参数,或者返回一个函数的函数。

// 高阶函数
function map(array, fn) {
    return array.map(fn);
}

const numbers = [1, 2, 3];
const doubled = map(numbers, x => x * 2); // [2, 4, 6]

4. 函数组合(Function Composition)

函数组合是指将多个函数组合成一个函数,使得一个函数的输出成为下一个函数的输入。

// 函数组合
const compose = (f, g) => x => f(g(x));

const add1 = x => x + 1;
const multiply2 = x => x * 2;

const addThenMultiply = compose(multiply2, add1);
console.log(addThenMultiply(5)); // 12

5. 柯里化(Currying)

柯里化是指将一个多参数函数转换为一系列单参数函数的过程。

// 柯里化
function add(a) {
    return function(b) {
        return a + b;
    };
}

const add5 = add(5);
console.log(add5(10)); // 15

6. 递归(Recursion)

递归是指函数调用自身的过程。在函数式编程中,递归常用于替代循环。

// 递归
function factorial(n) {
    if (n === 0) return 1;
    return n * factorial(n - 1);
}

console.log(factorial(5)); // 120

7. 闭包(Closures)

闭包是指函数能够访问其词法作用域中的变量,即使函数在其词法作用域之外执行。

// 闭包
function createCounter() {
    let count = 0;
    return function() {
        count++;
        return count;
    };
}

const counter = createCounter();
console.log(counter()); // 1
console.log(counter()); // 2

常用函数式编程工具

JavaScript 提供了一些内置的高阶函数,如 map、filter、reduce 等,这些函数非常适合函数式编程。

const numbers = [1, 2, 3, 4, 5];

// map
const doubled = numbers.map(x => x * 2); // [2, 4, 6, 8, 10]

// filter
const evens = numbers.filter(x => x % 2 === 0); // [2, 4]

// reduce
const sum = numbers.reduce((acc, x) => acc + x, 0); // 15
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值