Blog
首页
文档
收藏
关于
  • 在线转换时间戳 (opens new window)
  • 在线压缩图片 (opens new window)
  • Float-Double转二进制 (opens new window)
  • 文件转Hex字符串 (opens new window)

HiuZing

🍑
首页
文档
收藏
关于
  • 在线转换时间戳 (opens new window)
  • 在线压缩图片 (opens new window)
  • Float-Double转二进制 (opens new window)
  • 文件转Hex字符串 (opens new window)
  • 前端面试题

    • Vue

    • 计算机网络

    • CSS

    • JavaScript

      • JavaScript-闭包
      • JavaScript-原型链
      • JavaScript-new操作符具体做了什么?
      • JavaScript-浅拷贝和深拷贝
        • JavaScript-微服务和宏服务
        • JavaScript-Promise
        • JavaScript-find和filter区别
        • JavaScript-some和every区别
        • JavaScript-垃圾回收机制
        • 常见面试题
      • 小程序

      • 面试记录

    • JavaScript

    • Vue2

    • port

    • CSS

    • Node.js

    • JavaScript优化

    • uniapp

    • Mini Program

    • TypeScript

    • 面向对象编程

    • UI组件

    • Plugin

    • Vue3

    • 性能优化

    • Axios

    • 状态管理

    • React

    • Mock

    • Icon

    • Template

    • 构建工具

    • 项目规范配置

    • Taro

    • SVG

    • React Native

    • 前端
    • 前端面试题
    • JavaScript
    HiuZing
    2022-04-06
    目录

    JavaScript-浅拷贝和深拷贝

    # 浅拷贝

    浅拷贝:对基本类型的值拷贝,以及对象类型的地址拷贝。

    var a = 1;
    var b = a;// 浅拷贝
    b = 2	  // 改变b的值,并不会影响到a,因为浅拷贝对基本类型而言就是值拷贝
    console.log(a) //1
    
    1
    2
    3
    4

    a还是1

    对象也适用

    var p1 = {
        name:'jack'
    }
    
    var p2 = p1
    p2.name = 'rose'
    
    console.log(p1)// { name: 'rose' }
    
    1
    2
    3
    4
    5
    6
    7
    8

    # 深拷贝

    深拷贝:除了拷贝基本类型的值,还完全复刻了对象类型。

    一个对象在内存中是固定存在的,我们如果要对其进行深拷贝,唯一的办法就是创建一个新的对象,里面的值完全复刻原来的对象。

    var p1 = {
        name:'jack'
    }
    
    var p2 = {
        name:p1.name
    }
    p2.name = 'rose'
    console.log(p1) // { name: 'jack' }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9

    以上操作,我们对p2进行改造不会影响到p1,这就是深拷贝。

    但用这种方法实现深拷贝是可以的,但熟悉太多的话,就会很繁琐。

    # JSON进行转换

    实际开发中,可能这种方式用的更多一些,比如把一些数据转成JSON存储在本地缓存,需要用到的时候,我们再反序列化。

    var p1 = {
        name:'jack',
        age:12
    }
    
    var p2 = JSON.parse(JSON.stringify(p1))
    
    p2.name = 'rose'
    console.log(p1)//{ name: 'jack', age: 12 }
    console.log(p2)//{ name: 'rose', age: 12 }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10

    # 深拷贝递归

    // deepCopy接收两个参数,dest目标对象,src源对象
    function deepCopy(dest,src){
        // 对目标对象进行判空,如果为空就赋值一个空对象,保证dest有值
        var dest = dest || {}
        // 遍历src所有属性
        for(var key in src){
            // 如果对象的属性又是对象,则递归处理
            if(typeof src[key] === "object"){
                // 判断src[key]是对象还是数组
                dest[key] = (src[key].construtor === Array)?[]:{}
                deepCopy(dest[key],src[key])
            }else{
                dest[key] =  src[key]
            }
        }
        return dest
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17

    测试:

    var p1 = {
        name: 'jack',
        age: 12,
        toy: {
            name: 'car'
        }
    }
    
    var p2 = deepCopy({}, p1)
    // deepCopy接收两个参数,dest目标对象,src源对象
    function deepCopy(dest, src) {
    	// 对目标对象进行判空,如果为空就赋值一个空对象,保证dest有值
        var dest = dest || {}
        // 遍历src所有属性
        for (var key in src) {
            // 如果对象的属性又是对象,则递归处理
            if (typeof src[key] === "object") {
                // 判断src[key]是对象还是数组
                dest[key] = (src[key].construtor === Array) ? [] : {}
                deepCopy(dest[key], src[key])
            } else {
                dest[key] = src[key]
            }
        }
        return dest
    }
    
    p2.toy.name = 'plane'
    console.log(p1)//{ name: 'jack', age: 12, toy: { name: 'car' } }
    console.log(p2)//{ name: 'jack', age: 12, toy: { name: 'plane' } }
    
    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
    上次更新: 2024/08/14, 04:14:33
    JavaScript-new操作符具体做了什么?
    JavaScript-微服务和宏服务

    ← JavaScript-new操作符具体做了什么? JavaScript-微服务和宏服务→

    最近更新
    01
    React Native 使用SVG
    08-13
    02
    Docker基础命令
    08-04
    03
    算数逻辑单元
    07-30
    更多文章>
    Theme by Vdoing | Copyright © 2021-2024 WeiXiaojing | 友情链接
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式