Object.assgin基本知识与相关深浅拷贝
语法
//target:目标对象 sources:源对象
Object.assign(target, ...sources)
参数
target:目标对象
sources:源对象
描述
1)、 如果目标对象中的属性具有相同的键,则属性将被源对象中的属性覆盖。
2)、 该方法使用源对象的[[Get]]
和目标对象的[[Set]]
,所以它会调用相关 getter 和 setter。
3)、它分配属性,而不仅仅是复制或定义新的属性。如果合并源包含getter,这可能使其不适合将新属性合并到原型中。为了将属性定义(包括其可枚举性)复制到原型,应使用Object.getOwnPropertyDescriptor()
和Object.defineProperty()
。
4)、String
类型和 Symbol
类型的属性都会被拷贝。
5)、在出现错误的情况下,拷贝会被打断
用法
1) 复制一个对象
2) 合并对象
结论:目标对象o1也会变化
3) 合并具有相同属性的对象
结论:目标对象中的属性具有相同的键,则属性将被源对象中的属性覆盖
4) 继承属性和不可枚举属性是无法拷贝
5) 原始类型会包装为对象
结论:1)原始类型会被包装,null 和 undefined 会被忽略。
2)只有字符串的包装对象才可能有自身可枚举属性。
6) 拷贝Symbol类型的属性
7) 异常,拷贝会被打断
二、关于Object.assgin()引出是深拷贝还是浅拷贝的问题:
有人说是深拷贝,有人说是浅拷贝,也不见的谁错或对(某些特定情况下)
浅拷贝:仅仅是复制了引用,彼此之间的操作会互相影响,一个改变,另一个也改变
深拷贝:创建新的内存地址保存值,彼此之间相互独立,互不影响
了解深浅拷贝的前提是了解原始值和引用值,可查看《js基础-值类型和引用类型》
深拷贝的时候:
结论:改变了复制对象(copyobj)的name .源对象(obj)的name没有变化,为深拷贝
浅拷贝的时候:
结论:复制对象(copyobj1)改变了属性值name,源对象(obj1)的属性值name没有改变。但是复制对象copyobj1改变了grade属性值后,源对象(obj1)的grade也改变了。
综合结论:Object.assgin()拷贝的是属性值。假如源对象的属性值是一个对象,它也只拷贝那个引用值。
若源对象中只有一级属性,此方法为深拷贝。
若源对象有二级属性【如对象中有对象的时候,数组中还有数组的时候】,此方法是浅拷贝。
Object.assgin基本知识与相关深浅拷贝的更多相关文章
- 关于Java的Object.clone()方法与对象的深浅拷贝
文章同步更新在个人博客:关于Java的Object.clone()方法与对象的深浅拷贝 引言 在某些场景中,我们需要获取到一个对象的拷贝用于某些处理.这时候就可以用到Java中的Object.clon ...
- Object.clone()方法与对象的深浅拷贝
转载:[https://www.cnblogs.com/nickhan/p/8569329.html] 引言 在某些场景中,我们需要获取到一个对象的拷贝用于某些处理.这时候就可以用到Java中的Obj ...
- python---基础知识回顾(一)(引用计数,深浅拷贝,列表推导式,lambda表达式,命名空间,函数参数逆收集,内置函数,hasattr...)
一:列表和元组(引用计数了解,深浅拷贝了解) 序列:序列是一种数据结构,对其中的元素按顺序进行了编号(从0开始).典型的序列包括了列表,字符串,和元组 列表是可变的(可以进行修改),而元组和字符串是不 ...
- Python基础知识(六)------小数据池,集合,深浅拷贝
Python基础知识(六)------小数据池,集合,深浅拷贝 一丶小数据池 什么是小数据池: 小数据池就是python中一种提高效率的方式,固定数据类型使用同一个内存地址 代码块 : 一个文 ...
- python内存相关以及深浅拷贝讲解
3.9 内存相关 3.9.1 id,查看内存地址 >>> v1 = [11,22,33] >>> v2 = [11,22,33] >>> prin ...
- python基础知识5——赋值与深浅拷贝——整数和字符串,列表元组字典
深浅copy 一.数字和字符串 对于 数字 和 字符串 而言,赋值.浅拷贝和深拷贝无意义,因为其永远指向同一个内存地址. 1 import copy 2 # ######### 数字.字符串 #### ...
- python基础知识9---字符串拼接,深浅拷贝,三元运算
一.字符串格式化 Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3 ...
- set集合深浅拷贝以及知识补充
一. 对之前的知识点进行补充. 1. str中的join方法. 把列表转换成字符串 li = ["李嘉诚", "麻花藤", "黄海峰", & ...
- python基础知识四 小数据池,深浅拷贝,集合+菜中菜
四.小数据池,深浅拷贝,集合+菜中菜 1小数据池 --缓存机制(驻留机制) '==' 判断两边内容是否相等 'is' 基于内存地址进行判断是否相同 a = 10 b = 10 print(a ...
- python——赋值与深浅拷贝
初学编程的小伙伴都会对于深浅拷贝的用法有些疑问,今天我们就结合python变量存储的特性从内存的角度来谈一谈赋值和深浅拷贝~~~ 预备知识一——python的变量及其存储 在详细的了解python中赋 ...
随机推荐
- python基础语法&数据类型&运算符
1.标识符 # -*- coding:utf-8 -*- # @Time :2021/1/16 10:28 # @Author :QAbujiaban # @Email :wbxztoo@163.co ...
- 用Echarts实现SpreadJS引用从属关系可视化
在金融行业,我们经常会有审计审查的需求,对某个计算结果进行审查,但是这个计算结果可能依赖多个单元格,而且会有会有多级依赖的情况,如果让我们的从业人员靠眼睛找,工作量巨大,而且准确性存疑,基本上死路一条 ...
- C++进阶(哈希)
vector容器补充(下面会用到) 我们都知道vector容器不同于数组,能够进行动态扩容,其底层原理:所谓动态扩容,并不是在原空间之后接续新空间,因为无法保证原空间之后尚有可配置的空间.而是以原大小 ...
- HBase详解(03) - HBase架构和数据读写流程
RegionServer 架构 每个RegionServer可以服务于多个Region 每个RegionServer中有多个Store, 1个WAL和1个BlockCache 每个Store对应一个列 ...
- Lombok中@Builder和@SuperBuilder注解的用法
@Builder 是 lombok 中的注解.可以使用builder()构造的Person.PersonBuilder对象进行链式调用,给所有属性依次赋值. Person person1 = Pers ...
- AIR32F103(八) 集成Helix MP3解码库播放MP3
目录 AIR32F103(一) 合宙AIR32F103CBT6开发板上手报告 AIR32F103(二) Linux环境和LibOpenCM3项目模板 AIR32F103(三) Linux环境基于标准外 ...
- liunx系统安装JDK环境详细步骤
Liunx系统安装JDK环境详细步骤 一 下载liunx版本jdk压缩包 进入JDK官方网站下载jdk压缩包.下载前需要登入账户,可以自己注册一个账户! 也可以使用本博主提供的网盘下载https:// ...
- mysql中的列类型
创建数据表的时候,指定的列可以存储的数据类型: CREATE TABLE book ( bid 列类型); ① 数值类型--可以不加引号 TINYINT 微整型,占一个字节 范围-128~127 ...
- 性能浪费的日志案例-使用Lambda优化日志案例
性能浪费的日志案例 注:日志可以帮助我们快速的定位问题,记录程序运行过程中的情况,以便项目的监控和优化.一种典型的场景就是对参数进行有条件使用,例如对日志消息进行拼接后,在满足条件的情况下进行打印输出 ...
- 读Java8函数式编程笔记04_类库
1. 默认方法 1.1. 接口中定义的包含方法体的方法,方法名有default关键字做前缀 1.1.1. 在任何接口中,无论函数接口还是非函数接口,都可以使用该方法 1.2. Collection接口 ...