手撕常用代码
夯实基础,日常练习,点滴积累,进阶提升。(长期维护更新)
1. 浅拷贝:
1 | function clone(o) { |
2. 深拷贝:
1 | function deepClone(o) { |
3. 柯里化函数
// 通用版
1 | function curry(fn, args) { |
// ES6 写法
1 | const curry = (fn, arr = []) => (...args) => ( |
4. 手动封装定时函数
1 | function sleep(time) { |
5. reduce 实现 filter、map、数组扁平化等
1 | Array.prototype._map = function(callback) { |
1 | Array.prototype._filter = function(callback) { |
1 | // 求最大值/最小值 |
1 | // 数组去重 |
1 | // 数组扁平化 |
6. 防抖
1 | function debounce(fn, wait=500) { |
7. 节流
1 | function throttle(fn, wait=500) { |
8. 手撕 new
1 | function _new() { |
9. 手撕 call, apply, bind
call, apply, bind: 改变函数的执行上下文中的 this 指向,但不执行该函数(位于 Function 构造函数的原型对象上的方法)
- call 接受多个参数,第一个为函数上下文也就是 this,后边参数为函数本身的参数
- apply 接受两个参数,第一个参数为函数上下文 this,第二个参数为函数参数只不过是通过一个数组的形式传入的
- bind 接收多个参数,第一个是 bind 返回值,返回值是一个函数上下文的 this,不会立即执行
1 | Function.prototype.myCall = function(context = window) { |
1 | Function.prototype.myApply = function(context = window) { |
1 | Function.prototype.myBind = function(target) { |
10. 手动实现一个简单的 async/await
1 | // 定义一个Promise,用来模拟异步请求,作用是传入参数++ |
1 | // 所需要执行的Generator函数,内部的数据在执行完成一步的promise之后,再调用下一步 |
1 | // 自动执行器,如果一个Generator函数没有执行完,则递归调用 |
1 | asyncFun(func); |
11. 判断一个字符串是否为回文字符串
1 | function Palindromes(str) { |
12. 数字化金额格式处理
1 | function dealNumber(money) { |