橙晨燕

vuePress-theme-reco Visionwuwu    2020 - 2021
橙晨燕 橙晨燕

Choose mode

  • dark
  • auto
  • light
主页
分类
  • 大学课程
  • 前端
  • 力扣算法
  • 随笔
标签
时间线
收藏集
  • 爱看的书
  • 爱追的剧
其他
  • 每日壹题 📚
  • CET-4 🛰️
  • 技术文档 📖
  • 收藏文章 📮
  • 项目展示 🚀
  • 项目总结 📝
  • 工具箱 📦

    • 图片压缩
    • 阿里云
    • 腾讯云
    • 掘金
    • CSDN
关于我
GitHub
author-avatar

Visionwuwu

25

文章

8

标签

主页
分类
  • 大学课程
  • 前端
  • 力扣算法
  • 随笔
标签
时间线
收藏集
  • 爱看的书
  • 爱追的剧
其他
  • 每日壹题 📚
  • CET-4 🛰️
  • 技术文档 📖
  • 收藏文章 📮
  • 项目展示 🚀
  • 项目总结 📝
  • 工具箱 📦

    • 图片压缩
    • 阿里云
    • 腾讯云
    • 掘金
    • CSDN
关于我
GitHub
  • 面试宝典

    • 常见的css面试
    • 堆栈内存
    • 闭包
    • 深克隆和浅克隆
      • 浅克隆
      • 面试题手写一个深拷贝
    • 面向对象
    • 异步和同步
    • 防抖和节流
    • 前端性能优化之CRP
    • 常见的vue面试题
    • 数组去重
    • 前端经典算法
    • 手写Promise

深克隆和浅克隆

vuePress-theme-reco Visionwuwu    2020 - 2021

深克隆和浅克隆


Visionwuwu 2020-05-25 javascript

  • 浅克隆
  • 面试题手写一个深拷贝

# 浅克隆

浅拷贝一般都是传地址,实现浅拷贝的方式

  1. 直接赋值
let obj = {
    name: 'hero',
    age: 11
}
let obj1 = obj
1
2
3
4
5
  • 小练习一
let a = 1
let b = a
b = 2
console.log(a)
console.log(b)
1
2
3
4
5
解析
  1. 定义变量a赋值为1
  2. 定义变量b将a赋给b
  3. b重新赋值为2

答案

  1. 输出 1
  2. 输出 2
  • 小练习二
let arr = [1]
let arr1 = arr
arr1.push(2)
console.log(arr)
console.log(arr2)
1
2
3
4
5
解析

答案

  1. [1,2]
  2. [1,2]

# 面试题手写一个深拷贝

let obj = {
    a: null,
    b: undefined,
    c: 1,
    d: /[^\d]+/,
    e: new Date(),
    f: {
        name: 'fa',
        age: 20,
        oo:{o1: 12},
        arr: []
    },
    g:[1,3,{g: 11},/\d+/, []]
}
// 对象才继续递归拷贝,其他数据类型直接返回
function deepClone(obj){
    // 如果是null
    if(obj === null) return obj
    // 如果是undefined
    if(obj === undefined) return obj
    // 如果是数字,字符串
    if(typeof obj === 'number' || typeof obj === 'string') return obj
    // 如果是正则
    if(obj instanceof RegExp) return new RegExp(obj)
    // 如果是日期对象
    if(obj instanceof Date) return new Date(obj)
    // 对象或者数组
    if(obj instanceof Object){
        // 创建一个当前对象的实列
        let newObj = new obj.constructor()
        // 遍历对象上的每个属性,进行递归拷贝
        Object.keys(obj).forEach(key=>{
            newObj[key] = deepClone(obj[key])
        })
        return newObj;
    }
}
let newObj = deepClone(obj)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
在 GitHub 上编辑此页 !
最后一次更新: 5 个月前