JS的深拷贝和浅拷贝

这篇具有很好参考价值的文章主要介绍了JS的深拷贝和浅拷贝。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

‍本文作者是360奇舞团开发工程师

数据类型的数据存储

在讨论深拷贝和浅拷贝之前,先来了解下Js基本数据和引用数据类型的存储问题

  • 基本数据类型:Number String Boolean Undefined Symbol Null

  • 引用类型 :Object,function,Array等

基本数据类型的值存放在栈中,在栈中存放的是对应的值;引用类型对应的值存放在堆中,在栈中存放的是指向堆内存的地址,
下面看下数据的赋值过程

  • 基本数据类型赋值是生成相同的值,两个存放在不同地址;

  • 引用类型赋值,是将对象的内存地址赋值到另一个对象,两个变量指向堆内存中同一个对象

基本数据类型的赋值过程

let t1 = 66
let t2 =t1
t1= 88
console.log("t1="+t1+"\t t2="+t2)
输出:
t1=88    t2=66

JS的深拷贝和浅拷贝,javascript,前端,开发语言,ecmascript,vue.js

引用类型的赋值过程

let  obj1={
    name:"张三",
    age:6

}
let obj2 = obj1
obj1.name="zhangsan"
console.log("obj1="+JSON.stringify(obj1)+"\t obj2="+JSON.stringify(obj2))
输出:
obj1={"name":"zhangsan","age":6}         obj2={"name":"zhangsan","age":6}

JS的深拷贝和浅拷贝,javascript,前端,开发语言,ecmascript,vue.js

深拷贝和浅拷贝

了解了数据类型的存储类型,那么深拷贝和浅拷贝就容易理解了

浅拷贝

浅拷贝:指的是创建新的数据,这个数据和原始数据相同,如果属性是基本类型,拷贝的就是基本类型的值,如果属性是引用类型,拷贝的就是内存地址

代码实现一个浅拷贝
function shallowCopy(obj) {
    let newObject ={}
    for (let key in obj) {
        if(obj.hasOwnProperty(key)){
            newObject[key] = obj[key]
        }
    }
    return newObject
}
let  p={
    name:"zhangsan",
    hobby:{
        playTime:"12年"
    }
}

let p1 = shallowCopy(p)
console.log("p1="+JSON.stringify(p1))
console.log("p=" + JSON.stringify(p))
p.hobby.playTime = "16年"
p.name="李四"
console.log("p1=" + JSON.stringify(p1))
console.log("p=" + JSON.stringify(p))
输出:
p1={"name":"zhangsan","hobby":{"playTime":"12年"}}
p={"name":"zhangsan","hobby":{"playTime":"12年"}}
p1={"name":"zhangsan","hobby":{"playTime":"16年"}}
p={"name":"李四","hobby":{"playTime":"16年"}}

深拷贝

深拷贝是开辟一个新的栈,两个对象完全相同,但是对应两个不同地址,修改任一对象不会影响另一个对象

代码实现一个深拷贝
let p = {
    name: "zhangsan",
    hobby: {
        playTime: "12年"
    }
}
function deepCopy(obj) {
    if(obj == null) return obj
    if (obj instanceof Date) return new Date(obj)
    if( obj instanceof RegExp) return RegExp(obj)
    if(typeof obj !="object") return obj
    let  targetObj ={}
    for (let key in obj) {
        if(obj.hasOwnProperty(key)){
            targetObj[key] = deepCopy(obj[key])
        }
    }
    return targetObj
}
let  p1=deepCopy(p)
console.log("p1=" + JSON.stringify(p1))
console.log("p=" + JSON.stringify(p))
p.hobby.playTime = "16年"
p.name = "李四"
console.log("p1=" + JSON.stringify(p1))
console.log("p=" + JSON.stringify(p))
输出:
p1={"name":"zhangsan","hobby":{"playTime":"12年"}}
p={"name":"zhangsan","hobby":{"playTime":"12年"}}
p1={"name":"zhangsan","hobby":{"playTime":"12年"}}
p={"name":"李四","hobby":{"playTime":"16年"}}

深拷贝和浅拷贝的区别

深拷贝和浅拷贝都创建出一个对象,但是拷贝对象属性的时候行为不一样,浅拷贝只复制指针,两个对象仍然共用一块内存,所以修改会相互影响;深拷贝出来的对象与原对象一模一样,但是不共用一块空间,修改互不影响

- END -

关于奇舞团

奇舞团是 360 集团最大的大前端团队,代表集团参与 W3C 和 ECMA 会员(TC39)工作。奇舞团非常重视人才培养,有工程师、讲师、翻译官、业务接口人、团队 Leader 等多种发展方向供员工选择,并辅以提供相应的技术力、专业力、通用力、领导力等培训课程。奇舞团以开放和求贤的心态欢迎各种优秀人才关注和加入奇舞团。

JS的深拷贝和浅拷贝,javascript,前端,开发语言,ecmascript,vue.js文章来源地址https://www.toymoban.com/news/detail-702978.html

到了这里,关于JS的深拷贝和浅拷贝的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 深拷贝和浅拷贝

    目录 一.Java的Cloneable和clone()方法 1.Object类中的clone() 2.实现Cloneable接口的类 3.通过clone()生成对象的特点 二.深拷贝和浅拷贝 1.浅拷贝 2.深拷贝 3.实现深拷贝的两种方法 1.一种是递归的进行拷贝 2.Json字符串的方式进行深拷贝 以下是Java中Object类中clone()方法,我们可以看到clone()方

    2024年02月01日
    浏览(63)
  • Python中的深拷贝浅拷贝

    浅拷贝就是:拷贝了引用,并没有拷贝内容,和在Linux中的硬链接有些类似,在python中,使用=赋值的动作就是一个浅拷贝 浅拷贝中的新旧对象,共用一个内存地址,当操作新旧对象中的任意对象,发生修改,内存地址中的值发生改变,则新旧对象都会发生变化;如果新旧对象

    2024年02月09日
    浏览(27)
  • 图解Python深拷贝和浅拷贝

    Python中,对象的赋值,拷贝(深/浅拷贝)之间是有差异的,如果使用的时候不注意,就可能产生意外的结果。 下面本文就通过简单的例子介绍一下这些概念之间的差别。 对象赋值 直接看一段代码: 代码的输出为: 下面来分析一下这段代码: 首先,创建了一个名为will的变

    2024年04月13日
    浏览(61)
  • 一文道破Java中的深拷贝,浅拷贝,零拷贝

    在Java编写代码中,对象的拷贝是一个常见的操作。根据拷贝的层次和方式不同,可以分为深拷贝、浅拷贝和零拷贝。本篇文章我们将详细介绍这三种拷贝方式的概念、实现方法以及使用场景,方便大佬学习及面试。 深拷贝是一种创建对象副本的方法,其中新对象与原始对象

    2024年02月04日
    浏览(26)
  • Java中的深拷贝与浅拷贝

    深拷贝和浅拷贝是编程中常用的两种对象复制方式,它们在复制对象时处理对象内部引用的方式上有所不同。 浅拷贝 浅拷贝(Shallow Copy)只复制对象的顶层结构,而不复制对象内部的引用对象。换句话说,浅拷贝只复制对象的值类型字段和引用类型字段的引用,而不复制引

    2024年01月22日
    浏览(27)
  • java关于深拷贝和浅拷贝的理解

    一、什么是拷贝 拷贝指的就是将一个对象的所有属性(成员属性)拷贝到一个有着相同类型的对象中去 Java中的数据类型分为基本数据类型和引用数据类型,对于这两种数据类型,在进行赋值、用作方法参数、返回值的时候,会有值传递和地址传递的区别。 二、概要 1.浅拷贝

    2024年02月08日
    浏览(33)
  • 关于深拷贝和浅拷贝你需要了解的内容

    深拷贝(Deep Copy)和浅拷贝(Shallow Copy)是在复制对象或数据结构时使用的两种不同的策略,它们的主要区别在于复制后新旧对象之间的关系以及对嵌套对象的处理方式。 浅拷贝: 浅拷贝创建一个新对象,并将原始对象的属性值复制到新对象中。 浅拷贝通常是通过复制引用

    2024年02月07日
    浏览(29)
  • 【面试刷题】——什么是深拷贝和浅拷贝?

    深拷贝(Deep Copy)和浅拷贝(Shallow Copy)是在编程中用来描述对象拷贝的两个概念,特别是在涉及对象包含其他对象(如嵌套数据结构、指针等)的情况下。 浅拷贝是一种简单的拷贝操作,它只复制对象的内容,而不会复制对象所包含的其他对象。如果对象包含指针,浅拷贝

    2024年02月11日
    浏览(23)
  • 简单理解Python中的深拷贝与浅拷贝

    I. 简介 深拷贝会递归的创建一个完全独立的对象副本, 包括所有嵌套的对象 ,而浅拷贝只 复制嵌套对象的引用 ,不复制嵌套对象本身。 简单来说就是两者都对原对象进行了复制,因此使用is运算符来比较新旧对象时,返回的都是False(都开辟了新的内存);两者区别在于 对嵌

    2024年02月12日
    浏览(31)
  • JavaScript深拷贝(js深拷贝,JavaScript递归函数,实现深拷贝)

    简述:JavaScript的深拷贝和浅拷贝大家都比较熟悉,今天来分享下深拷贝,就是使用该函数时,会复制拷贝一份该数据,修改该数据属性,不会改变原有数据,就是把复制的对象所引用的对象全都复制了一遍,具体实现如下; 1、定义拷贝对象; 2、定义递归函数deepClone(),实现

    2024年02月15日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包