学好JavaScript(二)| 青训营笔记

88 阅读3分钟

这是我参与「第五届青训营」伴学笔记创作活动的第 5 天

重点内容

  • 过程抽象的编码原则
  • 代码关注点及优化方法

详细介绍

编码原则

过程抽象

  • 用于处理局部细节控制的一些方法
  • 函数式编程思想的基础应用

举个例子:为了能够让“只执行一次”这个需求覆盖不同的事件处理,我们可以将这个需求剥离出来。这个过程我们称为过程抽象。

短期内控制只执行一次的方法
function once(fn) {
  return function(...args) {
    if (fn) {
      const ret = fn.apply(this, args);
      fn = null;
      return ret;
    }
  }
}

传入参数fn一般为一个函数,再次进入时,fn = null导致不会执行

高阶函数HOF
  • 函数作为参数
  • 函数作为返回值
  • 常用作函数装饰器
常用高阶函数
  • once:短时间内忽略重复
  • throttle:节流函数,一段时间内只执行一次
  • debounce:防抖函数,用户操作停止后再触发
  • consumer:异步转同步
  • iterative:操作多个元素
纯函数
  • 结果可预期
  • 便于测试,用console.assert(),不需要特定的外部环境
  • 改变状态的函数不是纯函数
  • 高阶函数的输出是确定的,可以用不同的函数作为参数测试
编程范式
  • 主要有命令式和声明式
  • JS全部都支持
  • 命令式:关注怎么做
  • 声明式:关注做什么
  • 声明式可以省下逻辑分支的代价

代码关注点

  • 风格
  • 效率
  • 约定
  • 设计
  • 使用场景

代码质量优化之路

交通灯

需求
  • 若干个交通灯
  • 依次改变颜色
优化
  • 简单粗暴:五个定时器

  • 数据抽象

    • 定义状态列表
    • 递归调用切换函数
  • 过程抽象

    • 定义等待方法
    • 定义轮换方法(参数是切换函数)
    • 定义切换方法
    • 轮换函数可以复用
  • 异步+函数式

    • 定义等待方法
    • 定义切换方法
    • 放进一个循环

判断整数是不是4的幂数

需求
  • 如果是,返回true
  • 如果不是,返回false
优化
  • 简单粗暴:直接去除

  • 按位操作:最后两位是不是11

  • 数学方法

    • 大于等于1
    • 利用a & a-1可以使得二进制数中的1减少一个(可以用数学归纳法证明),判断整个数的二进制只有一个1(在最高位)
    • 二进制数偶数位不能有1
  • 字符串:先二进制,转字符串,再用正则表达式

洗牌

需求
  • 传入一个数组
  • 将数组中的元素打乱
优化
  • 错误写法

    • 根据随机数,如果大于0.5就交换
    • sort方法的特性使然
    • 数值越小,越可能出现在前面
  • 随机抽一张牌,放到最后,扫描整个数组

  • 使用生成器:用yield可以取出前几张

红包分配

需求
  • 总金额已知
  • 每人最少一分钱
优化
  • 总金额已知
  • 每人最少一分钱

个人总结

剩余的编码原则以及代码优化方法