前端面试手写题 -- (二)深拷贝

这道题考查 js 的变量类型和计算。
js 六大数据类型:Number、String、Boolean、Object、null、undefined。
ES6 又引入了一种新的原始数据类型 Symbol,表示独一无二的值。
其中值类型包括 Number、String、Boolean、null、undefined、Symbol,引用类型包括 Object、Array、Function。

深拷贝代码

function deepClone(obj){
    if(typeof obj !== 'object' || obj == null){ 
        return obj //obj为值类型,直接返回
    }
    let res;
    if(obj instanceof Array){ //判断obj为Array还是Object
        res = []
    }else{
        res = {}
    }
    for(let key in obj){
        if(obj.hasOwnProperty(key)){
            result[key] = deepClone(obj[key])
        }
    }
    return res
}

需要注意的点:

  • typeof 用来判断值类型,但是无法判断 null,因为 typeof null 返回 Object;
  • obj instanceof Array 判断 obj 是 Array 还是 Object,还可以用 Array.isArray(obj) 来判断;
  • hasOwnProperty 是js中唯一一个处理属性,但是不查找原型链的函数。用来判断自身属性是否存在,返回boolean;
  • for in 既可以遍历数组,也可以遍历对象,得到对象的 key 或数组的下标。
    在这里插入图片描述
    在这里插入图片描述
    除了手写外,Object.create(obj) 也可以实现深拷贝,它通过原型链的方式,使用现有对象来提供新创建对象的__proto__。

new Object(obj) 这种写法可以实现浅拷贝。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 实现一个数组去重的函数 思路:使用对象来存储数组中的元素,遍历数组,若元素在对象中不存在,则存储到对象中,并将其推入新数组中。 2. 实现一个函数,判断一个字符串是否是回文字符串 思路:将字符串翻转,与原字符串比较是否相等。 3. 实现一个函数,可以将多维数组转化为一维数组 思路:使用递归来遍历多维数组,将每个元素推入新数组中,直到遍历完所有元素。 4. 实现一个函数,统计一个字符串中出现次数最多的字符 思路:使用对象来存储每个字符出现的次数,遍历字符串,将每个字符存储到对象中,找到出现次数最多的字符。 5. 实现一个函数,实现数组的冒泡排序 思路:使用双重循环遍历数组,比较相邻两个元素的大小,如果前者大于后者,则交换两个元素的位置,直到遍历完数组。 6. 实现一个函数,实现数组的快速排序 思路:选择数组中的一个元素作为基准点,将数组分为两个部分,一部分大于基准点,一部分小于基准点,递归处理两个部分。 7. 实现一个函数,实现数组的深拷贝 思路:使用递归遍历数组中的每个元素,判断元素类型,如果是对象或数组,则进行深拷贝,如果是基本类型,则直接复制。 8. 实现一个函数,实现函数的柯里化 思路:使用闭包保存参数,当参数个数达到预设值时,执行函数。 9. 实现一个函数,实现函数的节流 思路:使用定时器来控制函数执行的频率,每次函数执行时,清除定时器并重新设置一个定时器。 10. 实现一个函数,实现函数的防抖 思路:使用定时器来延迟函数执行,每次函数执行时,清除定时器并重新设置一个定时器。如果在定时器延迟时间内再次触发函数,则重新计时。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值