常见面试题(闭包,深拷贝,数组扁平化,数组去重)--持续更新

本文介绍了JavaScript中的闭包概念,通过防抖函数实例展示了其作用。接着讨论了深拷贝的实现方式,以及如何进行数组的扁平化和去重操作。最后提到了ES10中的数组扁平化新特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.闭包

内部函数调用外部函数的作用域及变量

手写一个闭包(防抖函数)

// 闭包(手写防抖举例)
        //   防抖函数
        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]
        }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值