一.闭包
内部函数调用外部函数的作用域及变量
手写一个闭包(防抖函数)
// 闭包(手写防抖举例)
// 防抖函数
function debounce(fn, t) {
let timer
return function () {
//定时器
if (timer) clearTimeout(timer)
timer = setTimeout(() => {
fn()
}, 500)
}
}
const input = document.querySelector('input')
function log() {
console.log(input.value)
}
input.addEventListener('input', debounce(log, 1000))
二.深拷贝
浅拷贝:基础数据类型,创建一个空对象,存放原始数据的值,修改不会影响原始值
引用数据类型,拷贝的是它的地址,修改后原始值也会被修改
深拷贝:内存中开辟一个空间,修改都不会影响原始数据
手写一个深拷贝:
// 深拷贝
function dCopy(obj) {
// 如果是基本数据类型,直接返回
if (typeof obj !== 'object' || obj === null) return
}
let copy = Array.isArray(obj) ? [] : {}
for (let key in Object) {
// 是否是对象自身属性,而非继承原型上的属性
if (obj.hasOwnProperty(key)) {
copy[key] = dCopy(obj[key]);
}
return copy
}
三:数组扁平化
// 数组扁平化
let arr = [1, 2, [3, [5]]]
function arr1(arr) {
let res = []
for (let i = 0; i < arr.length; i++) {
if (Array.isArray(arr[i])) {
// 递归处理嵌套数组
res = res.concat(arr1(arr[i]))
} else {
res.push(arr[i])
}
}
return res
}
// 举例
console.log(arr1(arr)) //[1,2,3,5]
// ES10
let arr1 = [1, 2, [3, [4, 5]]]
let newArr = arr1.flat(Infinity)
console.log(newArr) //[1, 2, 3, 4, 5]
四:数组去重
//数组去重
// 方法1. Sst
const num = [1, 1, 2, 3, 3, 4, 5]
const newNum = [...new Set(num)]
console.log(newNum) //[1,2,3,4,5]
// 方法2.filter
{
const num = [1, 1, 2, 3, 3, 4, 5]
const newNum = num.filter((item, index) =>
num.indexOf(item) === index
)
console.log(newNum) //[1,2,3,4,5]
}