1.浅拷贝
数据分为基本数据类型和引用数据类型
基本数据类型:string number boolean null undefined Symbol bigInt
引用数据类型:普通对象object
存储值方面
基本数据类型存储在栈当中;
引用数据类型存储的是该对象在栈中的引用,真实数据存放在堆中;
深拷贝和浅拷贝是针对object和array这样的引用值而言的;
浅拷贝得到的新值改变时,原始值的基本数据类型不变,引用数据类型会变;
浅拷贝是创建一个新对象,如果类型是基本数据类型,那么拷贝的就是基本类型的值,如果是引用类型,拷贝的就是内存地址;
2.深拷贝
深拷贝得到的新值改变时,原始值的基本数据类型和引用数据类型都不会改变
方法一:
JSON.Parse(JSON.Stringfy())
原理:利用JSON.Stringfy()将对象转换为对象字符串
利用JSON.Parse()将对象字符串解析为对象
方法二:使用递归
3.实现bind
bind用来改变this指向,返回的是一个新的函数,第一个参数为this指向,其余参数为数组;
4.实现instanceof
instanceof用来检测构造函数的prototype属性是否出现在某个实例的原型对象上;
语法:object instanceof contructor
实现原理:如果右边变量的prototype在左边变量的原型链上即可;
因此instanceof在查找的过程中会遍历左边变量的原型链,知道找到右边变量的prototype;
方法一:while写法
方法二:使用递归的写法
5.快速排序
6.promise.all
测试一下~
7.数组去重
方法一:
使用ES6的set去重
let newArr = new Set(arr);
方法二:使用map和filter
8.数组扁平化
方法一:使用递归实现
方法二:使用flat()方法实现,参数n为转换后的维度
arr.flat(n);
方法三:使用扩展运算符
some用于判断数组中的元素是否满足条件
方法四:使用reduce实现数组的flat方法
reduce()对数组中的每一个元素执行一个由自己提供的reducer函数,将结果汇总为单个返回值,
reduce中的参数a为累计值,b为数组中的当前值
9.节流
在前端开发中有,有部分用户的行为会频繁触发事件执行,而对于DOM操作、资源加载等耗费性能的处理,这种频繁操作很可能会导致页面卡顿,甚至浏览器的奔溃;函数的节流(throttle)和防抖(debounce)可以解决这种问题;
节流(throttle)
当触发一个函数时,它在大于等于执行周期时才执行,周期内调用不执行;
场景:窗口调整(resize) 页面滚动(scroll) 购物车抢购(mousedown)
时间戳的写法:
定时器的写法:
时间戳版和定时器版的区别是:
时间戳版会在时间段内开始的时候触发函数;
定时器版的是在定时时间结束的时候触发函数;
10.防抖
防抖(debounce) 当触发一个事件后,在n秒内函数只执行一次,如果在n秒内又触发了事件,则会重新计算函数执行时间; 场景:实时搜索(keyup)、拖拽(mousemove)