跳到主要内容
面试知识DEV CATALOGNOTE

手写面试题

敲一些基础的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...