【实用】用 FP 思想将 JS 循环做简单封装~

简介: 本篇带来 FP 函数式编程思想在 JS【循环】中的应用。

image.png

本篇带来 FP 函数式编程思想在 JS【循环】中的应用。

闲言少叙,冲 (づ ̄3 ̄)づ╭~


通常,写一个循环:

for (let i=9; i<=22; i++) {
    // do something with i
}


或者:

let i = 9;
while (i <= 22) {
    // do something with i
    i++;
}


这样写有什么问题吗?


说有,也是有的 QAQ

  • 容易产生边际问题 —— 也叫做 “off-by-one” Bug,差一錯誤。比如漏写 < 号;
  • 如果索引 i 发生变化,循环就会造成错误(那为什么说 i 容易发生变化呢?因为对于循环来说,比如 while 结构,索引 i 是外部变量,外部变量的修改不受循环内部所控制;)
  • 代码太长了,循环结构有可能比操作的功能代码都长;


所以,我们尝试用 FP 函数式编程思路对循环做下改造~


改造后的期望类似这样:

range(9, 22).forEach(i => {
    /* do something with i */
})


range 函数实现:


const range = (from, to) => {
    const arr = [];
    do {
    arr.push(from);
    from++;
    } while (to >= from);
    return arr;
};


range(9,22) 展开就是 [9, 10, 11, … 22],如果,想要反转数组,比如:range(12,4) 展开是 [12,11,10...4]

const range = (from, to, step = Math.sign(to - from)) => {
    const arr = [];
    do {
    arr.push(from);
    from += step;
    } while ((step > 0 && to >= from) || (step < 0 && to <= from));
    return arr;
};
range(12,4)


这样,我们就做了一层简单的封装!

还有一个问题 —— 目前这样写,循环不受控制。即我们不能随意停止循环或者跳出循环;


为了解决这个问题,尝试采用 .some(fn) 来代替 .forEach(fn);

  • some() 方法测试数组中是不是至少有1个元素通过了被提供的函数测试。它返回的是一个Boolean类型的值。


e.g.

function isBiggerThan10(element, index, array) {
  return element > 10;
}
[2, 5, 8, 1, 4].some(isBiggerThan10);  // false
[12, 5, 8, 1, 4].some(isBiggerThan10); // true


只要 Fn 函数返回 false ,循环将继续;当它返回 true 时,循环将结束。

同时借助 generators,每次调用,它会产生一个返回值;


range() 函数演变如下:

function* range(from, to, step = Math.sign(to - from)) {
    do {
        yield from;
        from += step;
    } while ((step > 0 && to >= from) || (step < 0 && to <= from));
}
for (const i of range(9, 22)) { i => {
    ...
    ...
    if (someCondition) continue;
    ...
    if (somethingElse) break;
    ...
    ...
    }
}
// 或者赋值一个数组
const arrayFrom9To22 = [...range(9, 22)];
// this produces [9, 10, 11, ... 22]


通过这样的方式,甚至可以赋值一个数组 range(9,999999999999) 内存不会爆掉,因为它通过 generators 生成,是惰性的;MDN-迭代器 有说明:


Javascript中最常见的迭代器是Array迭代器,它只是按顺序返回关联数组中的每个值。 虽然很容易想象所有迭代器都可以表示为数组,但事实并非如此。 数组必须完整分配,但迭代器仅在必要时使用,因此可以表示无限大小的序列,例如0和无穷大之间的整数范围。


小结:通过 FP 函数式编程思维对“循环”进行了简单封装,使得代码的可读性和可扩展性都增强了一些,针不戳 👍


OK,以上便是本篇分享~


相关文章
|
3月前
|
JavaScript 前端开发
JS循环for、for...of、for...in
本文介绍了JavaScript中不同的循环语句,包括传统的`for`循环、`for...of`循环用于遍历数组和类数组对象、`for...in`循环用于遍历对象的属性,并通过示例代码展示了它们的用法和区别。
53 6
JS循环for、for...of、for...in
|
3月前
|
前端开发 数据安全/隐私保护
crypto-js中AES的加解密封装
文章介绍了如何在前端使用crypto-js库进行AES加密和解密,提供了加解密的函数封装示例,并演示了如何加密和解密字符串或对象。
325 1
crypto-js中AES的加解密封装
|
3月前
|
JavaScript 前端开发
JavaScript基础知识-流程控制之while循环
这篇文章介绍了JavaScript中的while循环和do...while循环的基础知识,并通过一个实际案例演示了如何使用while循环计算投资增长到特定金额所需的年数。
63 2
JavaScript基础知识-流程控制之while循环
|
2月前
|
JavaScript 前端开发
js循环有几种
js循环有几种
37 0
|
4月前
|
JavaScript 前端开发
JavaScript中有哪几种循环?他们的运用场景在哪?
JavaScript中有哪几种循环?他们的运用场景在哪?
|
4月前
|
JavaScript 前端开发 索引
js的循环中foreach、for in和for of的区别
js的循环中foreach、for in和for of的区别
175 0
|
1月前
|
JavaScript
js动画循环播放特效源码(上班族的一天)
js动画循环播放特效是一段实现了包含形象的卡通小人吃、睡、电脑工作的网页动画,js循环动画,简单的画面设计。非常丝滑有意思,欢迎对此代码感兴趣的朋友前来下载参考。
29 2
|
3月前
|
前端开发 JavaScript
前端基础(八)_JavaScript循环(for循环、for-in循环、for-of循环、while、do-while 循环、break 与 continue)
本文介绍了JavaScript中的循环语句,包括for循环、for-in循环、for-of循环、while循环、do-while循环以及break和continue的使用。
114 1
前端基础(八)_JavaScript循环(for循环、for-in循环、for-of循环、while、do-while 循环、break 与 continue)
|
3月前
|
JavaScript 前端开发
JavaScript基础知识-forEach循环
关于JavaScript基础知识中forEach循环的介绍。
53 1
JavaScript基础知识-forEach循环
|
3月前
|
JavaScript 前端开发 索引