首页 > 其他分享 >JS赋值、浅拷贝、深拷贝的区别

JS赋值、浅拷贝、深拷贝的区别

时间:2023-12-01 17:01:02浏览次数:29  
标签:console log 数据类型 JS let obj33 拷贝 赋值

在说明它们的区别之前,首先需要了解JS的数据类型和它们的存放位置。

 

 

数据类型

基本数据类型:String、Number、Boolean、Undefined、Null、Symbol(es6)、BigInt(es6)

引用数据类型:Object

 

 

存放位置

基本数据类型是存放在栈中的数据段,直接存储的就是值本体。

引用数据类型是存放在堆中的对象,因此栈中会生成一个对应的指针,也就是“地址”,指针指向的是堆中的具体位置。

 

 

区别

了解到以上内容后,就可以正式区分三种不同的方法啦。

 

赋值

给引用类型赋值的时候,赋值的是对象在栈中的指针地址,而不是在堆中的值本身,所以两者指向的是同一存储空间,当其一值发生变化的时候,两者都会改变。

let obj1 = {
  a: '1',
  b: '2',
  c: {
    d: '3'
  }
}
let obj11 = obj1
obj11.a = 'a'
obj11.c.d = 'd'

console.log('obj1', obj1)
console.log('obj11', obj11)

// obj1 { a: 'a', b: '2', c: { d: 'd' } }
// obj11 { a: 'a', b: '2', c: { d: 'd' } }

 

浅拷贝

浅拷贝区别于赋值的地方在于,它在堆中重新创建了新的内存空间,把原对象的值复制了一份赋给了新变量。所以当对象中的属性是基本类型时,两个对象互不影响对方;而当对象中的属性是引用类型时,因为共享了同一空间,会互相影响。

let obj2 = {
  a: '1',
  b: '2',
  c: {
    d: '3'
  }
}
let obj22 = Object.assign({},obj2)
obj22.a = 'a'
obj22.c.d = 'd'

console.log('obj2', obj2)
console.log('obj22', obj22)

// obj2 { a: '1', b: '2', c: { d: 'd' } }
// obj22 { a: 'a', b: '2', c: { d: 'd' } }

 

深拷贝

深拷贝的处理是最独立的,它在堆中完全开辟了新的内存地址,并将原对象完全复制过来。因此在修改深拷贝过的新对象时,二者完全独立、互不影响。

let obj3 = {
  a: '1',
  b: '2',
  c: {
    d: '3'
  }
}
let obj33 = JSON.parse(JSON.stringify(obj3))
obj33.a = 'a'
obj33.c.d = 'd'

console.log('obj3', obj3)
console.log('obj33', obj33)

// obj3 { a: '1', b: '2', c: { d: '3' } }
// obj33 { a: 'a', b: '2', c: { d: 'd' } }

 

 

注意

1. 以上区别只针对引用数据类型。

  基本类型就是直接把栈中存放的值本体给了出去,栈内存会开辟一个新的变量名,前后两个变量互不影响。

2.  浅拷贝使用Object.assign(target,sources) 的时候,target要设个空对象或者数组,否则就相当于直接赋值而不是浅拷贝。

 

 

标签:console,log,数据类型,JS,let,obj33,拷贝,赋值
From: https://www.cnblogs.com/emmamayday/p/17870454.html

相关文章

  • js 现在时间到当天24时结束
    获取到时间差为毫秒,可以转为时分秒,自行处理,getTimestamp(){letnowB=newDate().getTime()letform=newDate()lety=form.getFullYear();letm=form.getMonth()+1;letd=form.getDate();letnowE=newDate(y,m,d,"23","59","59"......
  • js vue中pdf与img互转
    需要npminstallvue-pdf和npminstallpdfjs-dist,新建js文件pdtToImg.js:importpdffrom"vue-pdf";importJsPDFfrom'pdfjs-dist';constPDFJS=require('pdfjs-dist/build/pdf.js');//import会报错window.pdfjsWorker=require('......
  • js 浏览器储存数据设置过期时间
    vue项目---新建文件sessionTime.js文件/**@descstorage相关*///typeTStorageItem={//value:any//expire:string|number//time:Date//};//type='localStorage'|'sessionStorage'/***@desc设置storage*@paramkey键*@pa......
  • 关于解决vue报错"Problems loading reference 'https://schemastore.azurewebsites.ne
    打开setting时会看到有一条三角形的警告信息 看问题描述:无法从该网站加载解决方法:打开设置,找到扩展下的json项 设置之后可以在settings.json文件中看到新增加一项 "json.schemaDownload.enable":false可以直接在界面上设置: "json.schemaDownload.enable":false......
  • JS逆向——某道翻译
    文章中所有内容仅供学习交流,不可用于任何商业用途和非法用途,如有侵权,请联系作者立即删除!目标网站:aHR0cHM6Ly9mYW55aS55b3VkYW8uY29tL2luZGV4Lmh0bWwjLw==一、定位接口使用Chrome浏览器,打开Network进行抓包输入要翻译的字符串:HelloWorld!页面没有重新加载,初步判断是Ajax......
  • js中get请求参数含有特殊字符的处理
    在拼接参数的时候,使用 encodeURIComponent() 进行手动转义。varurl="xxxx?name="+encodeURIComponent("aaa&bbb")特殊特殊字符的含义:字符特殊字符的含义URL编码+URL中+号表示空格%2B空格URL中的空格可以用+号或者编码%20/分隔目录和子目录%2F?分隔......
  • JMeter的JSON提取器JSON Path一次性提取多个
    JMeter调用接口时,返回一串列表,后面需要列表里的多个参数如下面接口返回示例,我需要提取每个数组里的vpc_id,后面需要用到{"vpcs":[{"vpc_name":"vpc1","vpc_id":"1712289779223859200"},{&qu......
  • Golang中如何自定义时间类型进行xml、json的序列化/反序列化
    在日常开发工作中,我们进行会遇到将struct序列化json字符串以及将json字符串反序列化为struct的场景,大家也对此十分熟悉。最近工作中,遇到了需要将struct序列化xml字符串以及将xml字符串反序列化为struct的场景,对于普通类型的字段,比如int、string等类型,直接......
  • 前端学习-JavaScript学习-js基础-API01
    学习视频:黑马程序员视频链接DOM简介DOM简介DOM树:将HTML文档标签以树状形式表现出来DOM对象:每个标签都是DOM对象DOM核心思想:将网页内容当作对象处理DOM中最大的对象:document,其次是<html><!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metan......
  • JSONObject参数顺序问题
    签名需要规定参数顺序不能错。一开始是这么写的JSONObjectparam=newJSONObject();param.put("idcard",user.getIdCard());param.put("mobile",user.getPhone());param.put("uid",user.getId());param.put("username",user.getName());期望得到的顺序应该......