#### 1. 多种方式实现数组去重、扁平化、对比优缺点
1. 扁平化:两种方法及更多
```
let arr = \[1,2,\[3,4\],\[5,6,\[7,\[8,9,\[10\]\]\]\]\]
// 方法一:使用递归扁平化
function flat(arr) {
let res = \[\]
arr.forEach(item \=> {
if(Array.isArray(item)) {
res = res.concat(flat(item))
} else {
res.push(item)
}
})
return res
}
console.log( flat(arr) )
//方法二,如果数组元素都是数字则使用toString()方法 //缺点:受限于数组内的元素只能为Number类型,场景非常有限
function flat2(arr) {
return arr.toString().split(',').map(item \=> {
return +item
})
}
console.log( flat2(arr) )
```
#### 2. 多种方式实现深拷贝、对比优缺点
#### 3. 手写函数柯里化工具函数、并理解其应用场景和优势
#### 4. 手写防抖和节流工具函数、并理解其内部原理和应用场景
1.防抖:debounce:事件在N秒内只执行一次,如果在N秒内又触发了事件,则时间重新开始计算
```
function debounce(fn, delay) {
let first = true
let timer = null
return function(){
const _this = this
if (first) {
fn.call(_this, arguments)
return
}
clearTimeout( timer )
timer = setTimeout( function(){
fn.call(_this, arguments)
}, delay || 500)
}
}
```
2.节流函数:throttle:让频繁触发的事件在指定的时间内只触发一次,比如:scroll,mousemove事件等
```
function Throttle(fn, delay) {
let first = true;
let timer = null;
let _fn = fn
return function() {
const _this = this
if (first) {
_fn.call(_this, arguments)
first = false
return
}
if (timer) return
timer = setTimeout(() => {
clearTimeout(timer)
timer = null
_fn.call(_this, arguments)
}, delay || 1000)
}
}
```
#### 5. 实现一个sleep函数