「通俗读物」- 深拷贝和浅拷贝

前言

大家好,我是珂圩

深浅拷贝在工作中也经常使用,大家多多少少都有些了解

本章来总结记录一下深浅拷贝的区别和方法,希望对你有所帮助

数据类型的存储方式

首先我们需要了解数据类型

  • 基本类型: number,string...
  • 引用类型: object

每种类型是如何存储的

基本类型 :保存在栈内存

引用类型 :保存在堆内存中,然后在栈内存中保存该数据堆内存的索引

浅拷贝

浅拷贝就是指只拷贝了栈内存中的数据 ,也就是说这份数据中存在引用类型的数据,也只是拷贝了该数据在栈内存中的索引

假如我们浅拷贝一份数据后(数据中含有引用类型),再修改拷贝后的数据中的引用类型,此时远数据也会改变

总结一下

  • 如果是基本类型就是拷贝基本类型的值
  • 如果是引用类型则是拷贝的内存地址

实现一个浅拷贝

js 复制代码
    function shallowClone(obj){
        const newObj = {}
        for(let prop in obj){
            if(obj.hasOwnProperty(prop)){
                newObj[porp] = obj[prop]
            }
        }
        return newObj
    }

在JavaScript中存在浅拷贝的方法有

object.assign

js 复制代码
    const obj = {...}
    const newObj = Object.assign({},obj)

Array.prototype.slice()

js 复制代码
    const arr = [1,2,3]
    const newArr = arr.slice(0) 

Array.prototype.concat()

js 复制代码
    const arr = [1,2,3]
    const newArr = arr.concat(0) 

...(扩展运算符)

js 复制代码
    const arr = [1,2,3]
    const newArr = [...arr]

深拷贝

深拷贝就是将数据完全拷贝成一个新数据,也就是开了一块新内存在存储数据, 修改拷贝后的新数据老数据也不会变

使用JSON.stringify()实现简易版的深拷贝,但是其中会存在一些问题,这种方式会忽略 undefined、symbol、function(函数)

js 复制代码
const obj = {...}
const newObj = JSON.parse(JSON.stringify(obj))

还有一种方式是循环递归来实现深拷贝

js 复制代码
function cloneDeep (obj,hash = new weakMap()){
    if(obj == null) return obj
    if(obj instanceof Date) return new Date(obj)
    if(obj instanceof RegExp) return new RegExp(obj)
    if(typeof obj !== 'object') return obj
    if(hash.get(obj)) return hash.get(obj)
    let cloneObj = new obj.constructor()
    hash.set(obj,cloneObj)
    for(let key in obj){
        if(obj.hasOwnProperty(key)){
            cloneObj[key] = cloneDeep(obj[key],hash)
        }
    }
    return cloneObj
}

结语

如果此文章对你有帮助,点个赞支持一下

后续还会不定时出一些文章或针对某个领域的系列文章

有兴趣的可以关注一下!

相关推荐
fruge19 小时前
Vue项目中的Electron桌面应用开发实践指南
前端·vue.js·electron
漂流瓶jz1 天前
Webpack中各种devtool配置的含义与SourceMap生成逻辑
前端·javascript·webpack
前端架构师-老李1 天前
React 中 useCallback 的基本使用和原理解析
前端·react.js·前端框架
木易 士心1 天前
CSS 中 `data-status` 的使用详解
前端·css
明月与玄武1 天前
前端缓存战争:回车与刷新按钮的终极对决!
前端·缓存·回车 vs 点击刷新
牧马少女1 天前
css 画一个圆角渐变色边框
前端·css
zy happy1 天前
RuoyiApp 在vuex,state存储nickname vue2
前端·javascript·小程序·uni-app·vue·ruoyi
小雨青年1 天前
Cursor 项目实战:AI播客策划助手(二)—— 多轮交互打磨播客文案的技术实现与实践
前端·人工智能·状态模式·交互
小光学长1 天前
基于Vue的儿童手工创意店管理系统as8celp7(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
前端·数据库·vue.js
meichaoWen1 天前
【Vue】Vue框架的基础知识强化
前端·javascript·vue.js