让你彻底理解浅拷贝和深拷贝的区别是什么_怎么让文件无法拷贝

让你彻底理解浅拷贝和深拷贝的区别是什么_怎么让文件无法拷贝在写js的时候经常会遇到复制对象,在复制对象的过程中往往会出现新对象改变原对象等等的一些问题,今天特意梳理一下,希望能帮助到遇到这些问题的开发人员。什么是浅拷贝,深拷贝以及和他们之间的区别赋值浅拷贝深拷贝在开始梳理之前先说一下值类型和引用类型:值类型(基本类型):字符串(string)、数值(number)、布尔值(boolean)、undefined、null;引用类型:对象(Object)、数组(Array)、函数(Function);1、什么是浅拷贝,深拷贝以及和他们之间的区别

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

在写js的时候经常会遇到复制对象,在复制对象的过程中往往会出现新对象改变原对象等等的一些问题,今天特意梳理一下,希望能帮助到遇到这些问题的开发人员。

  • 什么是浅拷贝,深拷贝以及和他们之间的区别
  • 赋值
  • 浅拷贝
  • 深拷贝

在开始梳理之前先说一下值类型和引用类型
值类型(基本类型):字符串(string)、数值(number)、布尔值(boolean)、undefined、null ;
引用类型:对象(Object)、数组(Array)、函数(Function);

1、什么是浅拷贝,深拷贝以及和他们之间的区别

  • 浅拷贝是创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型,拷贝的就是基本类型的值,如果属性是引用类型,拷贝的就是内存地址
  • 深拷贝是将一个对象从内存中完整的拷贝一份出来,从堆内存中开辟一个新的区域存放新对象。
  • 区别:浅拷贝基本类型之前互不影响,引用类型其中一个对象改变了地址,就会影响另一个对象;深拷贝
    改变新对象不会影响原对象,他们之前互不影响。

2、赋值

//对象赋值
let obj1 = { 
    name: '张三', action: { 
    say: 'hi'};
let obj2 = obj1;
obj2.name = '李四';
obj2.action.say = 'hello'
console.log('obj1',obj1) 
// obj1 { name: '李四', action: { say: 'hello'}
console.log('obj2',obj2) 
// obj2 { name: '李四', action: { say: 'hello'}

3、浅拷贝

原数据中包含子对象,改变新对象会使原数据一同改变

  • Object.assign()
//浅拷贝
let obj1 = { 
    name: '张三', action: { 
    say: 'hi'};
let obj2 = Object.assign({ 
   }, obj1);
obj2.name = '李四';
obj2.action.say = 'hello'
console.log('obj1',obj1) 
// obj1 { name: '张三', action: { say: 'hello'}
console.log('obj2',obj2) 
// obj2 { name: '李四', action: { say: 'hello'}
  • 展开运算符…
    展开运算符是一个 es6特性,它提供了一种非常方便的方式来执行浅拷贝,这与 Object.assign ()的功能相同。
//浅拷贝
let obj1 = { 
    name: '张三', action: { 
    say: 'hi'};
let obj2 = { 
   ... obj1};
obj2.name = '李四';
obj2.action.say = 'hello'
console.log('obj1',obj1) 
// obj1 { name: '张三', action: { say: 'hello'}
console.log('obj2',obj2) 
// obj2 { name: '李四', action: { say: 'hello'}

注:concat(),slice()也属于浅拷贝

4、深拷贝

  • JSON.parse(JSON.stringify())
//深拷贝
let obj1 = { 
    name: '张三', action: { 
    say: 'hi'};
let obj2 = JSON.parse(JSON.stringify(obj1));
obj2.name = '李四';
obj2.action.say = 'hello'
console.log('obj1',obj1) 
// obj1 { name: '张三', action: { say: 'hi'}
console.log('obj2',obj2) 
// obj2 { name: '李四', action: { say: 'hello'}
  • jQuery.extend()
    $.extend(deepCopy, target, object1, [objectN])//第一个参数为true,就是深拷贝
//深拷贝
let obj1 = { 
    name: '张三', action: { 
    say: 'hi'};
let obj2 = $.extend(true, { 
   }, obj1);
obj2.name = '李四';
obj2.action.say = 'hello'
console.log('obj1',obj1) 
// obj1 { name: '张三', action: { say: 'hi'}
console.log('obj2',obj2) 
// obj2 { name: '李四', action: { say: 'hello'}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/187148.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • GLCT认证考试辅导(1)

    GLCT认证考试辅导(1)

    2021年8月27日
    48
  • css自动换行属性与保留空白属性冲突_css换行样式

    css自动换行属性与保留空白属性冲突_css换行样式word-break属性规定自动换行的处理方法。提示:通过使用word-break属性,可以让浏览器实现在任意位置的换行。所有主流浏览器都支持word-break属性。语法:word-break:normal|break-all|keep-all;normal使用浏览器默认的换行规则。break-all允许在单词内换行。keep-all只能在半角空格或连字符处换行。word-break:break-all所有的都换行,右侧换行没有空隙。word-wrap属性允许

    2025年6月27日
    2
  • Ubuntu彻底卸载jdk「建议收藏」

    Ubuntu彻底卸载jdk「建议收藏」参考链接原链接1、移除所有java相关的包(sun,Oracle,openJDK,lcedTeaplugins,GIJ)#apt-getupdate#apt-cachesearchjava|awk'{print($1)}’|grep-E-e’^(ia32-)?(sun|oracle)-java’-e’^openjdk-‘-e’^icedtea’-e’^(default|gcj)-j(re|dk)’-e’^gcj-(.*)-j(re|dk)’-e’

    2022年6月25日
    36
  • Vue双向绑定原理(4改)

    Vue双向绑定原理(4改)Vue双向绑定的原理 双向数据绑定是通过数据劫持、结合、发布订阅,的方式来实现的,也就是说数据和视图同步,数据发生变化,视图跟着变化,视图变化,数据也随之发生改变; 使用watch来连接数据与视图,当数据发生变化时,触发通知所有该数据的对象进行更新。这!就是vue的双向绑定原理,你学会了吗?…

    2022年10月18日
    4
  • FileInputStream 读取文件内容「建议收藏」

    FileInputStream 读取文件内容「建议收藏」publicclassTest{publicstaticvoidmain(String[]args)throwsIOException{finalStringpath="D:/1.txt"; //1、得到数据文件 Filefile=newFile(path); //2、建立数据通道 FileInputStreamfile…

    2022年6月11日
    94
  • js获取当前日期时间「建议收藏」

    js获取当前日期时间「建议收藏」functionThistime(){//当前日期vardate=newDate();varyear=date.getFullYear();varmonth=date.getMonth()+1;varday=date.getDate();varmytime=date.toLocaleTimeString();//获取当前时间//myDate.toLocaleString()

    2025年7月11日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号