前端面试中一些手写题

117 阅读3分钟

1.浅拷贝

数据分为基本数据类型和引用数据类型
基本数据类型:string number boolean null undefined Symbol bigInt
引用数据类型:普通对象object
存储值方面
基本数据类型存储在栈当中;
引用数据类型存储的是该对象在栈中的引用,真实数据存放在堆中; 深拷贝和浅拷贝是针对object和array这样的引用值而言的;
浅拷贝得到的新值改变时,原始值的基本数据类型不变,引用数据类型会变;
浅拷贝是创建一个新对象,如果类型是基本数据类型,那么拷贝的就是基本类型的值,如果是引用类型,拷贝的就是内存地址;

shallowClone.png

2.深拷贝

深拷贝得到的新值改变时,原始值的基本数据类型和引用数据类型都不会改变
方法一:
JSON.Parse(JSON.Stringfy()) 原理:利用JSON.Stringfy()将对象转换为对象字符串
利用JSON.Parse()将对象字符串解析为对象

方法二:使用递归

ins2.png

3.实现bind

bind用来改变this指向,返回的是一个新的函数,第一个参数为this指向,其余参数为数组;

bindsss.png

4.实现instanceof

instanceof用来检测构造函数的prototype属性是否出现在某个实例的原型对象上;
语法:object instanceof contructor
实现原理:如果右边变量的prototype在左边变量的原型链上即可;
因此instanceof在查找的过程中会遍历左边变量的原型链,知道找到右边变量的prototype;
方法一:while写法

instanceof.png

方法二:使用递归的写法

instanceof2.png

5.快速排序

quickSort.png

6.promise.all

p2222.png 测试一下~

拼55.png

7.数组去重

方法一:
使用ES6的set去重
let newArr = new Set(arr);
方法二:使用map和filter

mappp.png

unique.png

8.数组扁平化

方法一:使用递归实现

递归.png

方法二:使用flat()方法实现,参数n为转换后的维度
arr.flat(n);

方法三:使用扩展运算符
some用于判断数组中的元素是否满足条件

扩展.png

方法四:使用reduce实现数组的flat方法
reduce()对数组中的每一个元素执行一个由自己提供的reducer函数,将结果汇总为单个返回值, reduce中的参数a为累计值,b为数组中的当前值

reduce.png

9.节流

在前端开发中有,有部分用户的行为会频繁触发事件执行,而对于DOM操作、资源加载等耗费性能的处理,这种频繁操作很可能会导致页面卡顿,甚至浏览器的奔溃;函数的节流(throttle)和防抖(debounce)可以解决这种问题;
节流(throttle) 当触发一个函数时,它在大于等于执行周期时才执行,周期内调用不执行; 场景:窗口调整(resize) 页面滚动(scroll) 购物车抢购(mousedown) 时间戳的写法: throttle.png

定时器的写法:

setTimeout.png 时间戳版和定时器版的区别是:
时间戳版会在时间段内开始的时候触发函数;
定时器版的是在定时时间结束的时候触发函数;

10.防抖

防抖(debounce) 当触发一个事件后,在n秒内函数只执行一次,如果在n秒内又触发了事件,则会重新计算函数执行时间; 场景:实时搜索(keyup)、拖拽(mousemove)

debounce.png