跳到主要内容

手写面试题

敲一些基础的f**k手写题

<DataLog>{result}</DataLog>包裹的数据,以及console的数据均可以在浏览器控制台看到输出的日志信息

数组扁平化(flat)

[1,2,[3,[4,5],6]] -> [1,2,3,4,5,6]

递归实现

实时编辑器
结果
Loading...

reduce实现

实时编辑器
结果
Loading...

reduce不传初始值:回调函数的第一个参数为数组的第一项,首轮遍历target为第二个参数

es6原生flat

arr.flat(depth)

其中 depth 是 flat 的参数,depth 是可以传递数组的展开深度(默认不填、数值是 1),即展开一层数组。如果层数不确定,参数可以传进 Infinity,代表不论多少层都要展开

实时编辑器
结果
Loading...

实现一个new

  1. 创建一个空对象,使空对象的原型链指向构造函数的原型。bar obj2
  2. 然后执行构造函数内的方法,内部的属性如foo obj让this指向新的空对象
  3. 将运行结果返回回去( 因为构造函数可能直接有return引用类型的数据 [] {} 所以要判断一下返回值)
实时编辑器
结果
Loading...

实现object.create

实时编辑器
结果
Loading...

实现call

  1. 判断传入上下文对象是否存在,如果不存在,则设置为 window
  2. 处理传入的参数,截取第一个参数后的所有参数
  3. 将函数作为上下文对象的一个属性
  4. 使用上下文对象来调用这个方法,并保存返回结果
  5. 删除刚才新增的属性
  6. 返回结果
实时编辑器
结果
Loading...

实现apply

  1. 判断传入上下文对象是否存在,如果不存在,则设置为 window
  2. 处理传入的参数,截取第一个参数后的所有参数(与call的差异)
  3. 将函数作为上下文对象的一个属性
  4. 使用上下文对象来调用这个方法,并保存返回结果
  5. 删除刚才新增的属性
  6. 返回结果
实时编辑器
结果
Loading...

实现bind

fn.bind(obj, ...args1)(...args2) 与call不同,bind返回一个新的函数,执行该函数会调用源函数,并且绑定和调用时都可以接收参数

  1. 在bind调用时,保存当前函数的引用,获取其余传入参数值,返回一个新的函数
  2. 调用新的函数可以接收新的参数,与bind调用时的参数结合
  3. 使用上下文对象来调用这个方法,并保存返回结果
  4. 删除刚才新增的属性
  5. 返回结果
实时编辑器
结果
Loading...

防抖

  1. 接收执行函数及延时时间,并返回新的函数
  2. 新的函数接收原执行函数所需要调用的参数
实时编辑器
结果
Loading...

节流

  1. 接收执行函数及执行间隔时间,并返回新的函数
  2. 新的函数接收原执行函数所需要调用的参数
实时编辑器
结果
Loading...

手写promise

  1. promise 内部保存一个状态 默认为等待状态
  2. 执行promise的函数体,需要更改状态执行 resolve 更改promise内的状态
  3. then方法执行回调,两个参数,成功和失败cb,promise内部判断状态不同的回调参数

这样实现有个问题 先执行then方法是无法执行内部更改状态的方法的。顺序应该是:

  1. 如果执行then时状态还是 pending 先订阅它,将其添加到内部的发布订阅任务队列中
  2. 状态更改后 遍历执行订阅队列的方法 (发布订阅的拆解)
实时编辑器
结果
Loading...

手写柯里化

实时编辑器
结果
Loading...

instanceof判断

instanceof可以正确判断对象的类型,其内部运行机制是判断在其原型链中能否找到该类型的原型

  1. 首先获取类型的原型
  2. 然后获得对象的原型
  3. 然后一直循环判断对象的原型是否等于类型的原型,直到对象原型为 null,因为原型链最终为 null
实时编辑器
结果
Loading...

数组去重

set

实时编辑器
结果
Loading...

map

实时编辑器
结果
Loading...

filter

实时编辑器
结果
Loading...

实现promise.all

Promise.all([promises]) promise.all 接收一个promise任务队列,队列中所有异步任务均执行完毕后会返回结果数组

实时编辑器
结果
Loading...

实现promise.race

实时编辑器
结果
Loading...

实现promise.resolve

实时编辑器
结果
Loading...

数字累加

实时编辑器
结果
Loading...

数组求和

实时编辑器
结果
Loading...

小孩报数问题

有30个小孩儿,编号从1-30,围成一圈依此报数,1、2、3 数到 3 的小孩儿退出这个圈, 然后下一个小孩 重新报数 1、2、3,问最后剩下的那个小孩儿的编号是多少?

实时编辑器
结果
Loading...

排序手写

实时编辑器
结果
Loading...