这是我参加[第五届青训营]伴学笔记创作活动的第3天
本堂课的知识点
- 了解写好JavaScript的编码原则
- 了解JavaScript如何代码优化的案例和思维
JavaScript入门推荐书目:
《JavaScript权威指南》(又称犀牛书)
《JavaScript高级程序设计》(又称红宝书)
《JavaScript语言精粹》与犀牛书的厚薄,戏言剩下的都是不好的哈哈
各司其责(职能分离)
支持浅色和深色浏览模式-通过class名切换样式而不是通过js中dom更改样式
纯css不涉及js:添加一个隐藏的checkbox的input,通过checkbox的状态判断浅色和深色
组件封装(UI组件正确性、扩展性、复用性)
eg.轮播图的封装,html是用无序列表展现每一张图片,然后通过css将图片叠加
最后是轮播图下面的点,通过自定义事件解耦
解耦:插件化(构造函数function)、模板化(Class)、抽象化(组件框架)
过程抽象(应用函数式编程思想)
eg.完成任务列表(我要做计划app),注意误点的操作,为了节流可通过once函数实现
常用的高阶函数(HOF):Once、Throttle、Debounce、Consumer、iterative
编程范式:命令式(how怎么做)与声明式(what做什么,易扩展)
代码优化
写代码应该关注:风格,效率,约定,使用场景,设计。依据具体业务分析择一或多个方面,虽然以上都需要关注,但最终还是回归使用场景。
引子
leftpad事件的吐槽点:(功能:前面补0)
因使用场景多而被多个依赖库所引用但作者下架后无法使用的吐槽
- NPM模块粒度(为何如此简单的代码要设定为一个模块)
- 代码风格
- 代码质量/效率
重构代码:
代码更简洁,效率更高,时间复杂度O(N)
在计算大数的时候性能更好,通过repeat和快速幂的形式,时间复杂度O(logN)
另一种方式
总结:如果针对leftpad的话没有性能优化的必要性,因为目前应用场景是十几和十几的数之间操作,仅此的话三种方式性能差不多,但若考虑其他复杂的话可以以此为思路。
案例1:交通灯
通过递归方式数据抽象封装
过程抽象
异步+函数式
感觉这种形式很像编辑单片机时那种最简单最普通的方式
案例2:判断是否是4的幂(leetcode简单题)
1.取模除数
2.位操作
3.a&(a-1)判断最终是否存在1
4.判断字符串是否存在
案例3:洗牌
用sort和random机率不均等
案例4:红包生成器
切西瓜法
抽牌法(栅栏法)