Object.assign方法有什么用?超详细测试用例、实例、可以在浏览器的控制台打印结果

Object.assign 是一个 JavaScript 方法,用于将一个或多个源对象的所有可枚举属性复制到目标对象中。它返回目标对象。这个方法常用于合并对象或浅复制对象。

语法

Object.assign(target, ...sources)
  • target: 目标对象。
  • sources: 一个或多个源对象。

示例

1. 合并对象

将多个对象的属性合并到一个对象中。

const target = { a: 1 };
const source1 = { b: 2 };
const source2 = { c: 3 };const result = Object.assign(target, source1, source2);console.log(result); // { a: 1, b: 2, c: 3 }
console.log(target); // { a: 1, b: 2, c: 3 }

为什么【const result = Object.assign(target, source1, source2);】里面的result和target的值都是一样的?
这是因为 Object.assign 会将所有源对象的属性复制到目标对象,并且返回的也是这个目标对象。所以,resulttarget 实际上是同一个对象的引用,它们会具有相同的值。更具体地说,Object.assign 是一个“浅拷贝”,它只拷贝对象的自身属性(不包括原型链上的属性),并且是按顺序进行的,所以后面的源对象的属性会覆盖前面的源对象的同名属性。

以下是一个详细的例子和解释:

示例代码

const target = { a: 1 };
const source1 = { b: 2 };
const source2 = { c: 3 };const result = Object.assign(target, source1, source2);console.log(result); // { a: 1, b: 2, c: 3 }
console.log(target); // { a: 1, b: 2, c: 3 }

解释

  1. 初始对象

    • target: { a: 1 }
    • source1: { b: 2 }
    • source2: { c: 3 }
  2. 执行 Object.assign(target, source1, source2)

    • 首先将 source1 的属性复制到 target:
      • target 变成 { a: 1, b: 2 }
    • 然后将 source2 的属性复制到 target:
      • target 变成 { a: 1, b: 2, c: 3 }
  3. 返回值

    • Object.assign 返回的对象就是 target,所以 resulttarget 都是指向同一个对象,它们的值完全相同。

深入理解

当你执行 Object.assign 时,它会修改 target 对象,并且返回这个修改后的对象。因此,resulttarget 实际上是同一个对象的引用,修改 result 也会修改 target,反之亦然。

在浏览器控制台中试试

你可以在浏览器的控制台中输入以下代码来验证:

const target = { a: 1 };
const source1 = { b: 2 };
const source2 = { c: 3 };const result = Object.assign(target, source1, source2);console.log('result:', result); // { a: 1, b: 2, c: 3 }
console.log('target:', target); // { a: 1, b: 2, c: 3 }
console.log(result === target); // true, 说明 result 和 target 是同一个对象的引用

通过这些代码,你可以观察到 resulttarget 的值是相同的,并且它们是同一个对象的引用。

2. 浅拷贝对象

创建对象的浅拷贝。

const obj = { a: 1, b: { c: 2 } };
const copy = Object.assign({}, obj);console.log(copy); // { a: 1, b: { c: 2 } }// 修改原对象不会影响拷贝对象(对于顶层属性)
obj.a = 10;
console.log(copy.a); // 1// 但是对于嵌套对象(浅拷贝),修改会反映在拷贝对象上
obj.b.c = 20;
console.log(copy.b.c); // 20
3. 添加新属性

可以使用 Object.assign 给对象添加新属性。

const target = { a: 1 };const result = Object.assign(target, { b: 2, c: 3 });console.log(result); // { a: 1, b: 2, c: 3 }
console.log(target); // { a: 1, b: 2, c: 3 }
4. 重写属性

如果源对象有与目标对象同名的属性,目标对象的属性将被源对象的属性覆盖。

const target = { a: 1, b: 2 };
const source = { b: 3, c: 4 };const result = Object.assign(target, source);console.log(result); // { a: 1, b: 3, c: 4 }
console.log(target); // { a: 1, b: 3, c: 4 }

在浏览器控制台中试试

在浏览器的控制台中,输入以下代码并查看输出结果:

const target = { a: 1 };
const source1 = { b: 2 };
const source2 = { c: 3 };const result = Object.assign(target, source1, source2);console.log('合并后的对象:', result);
console.log('目标对象:', target);const obj = { a: 1, b: { c: 2 } };
const copy = Object.assign({}, obj);console.log('浅拷贝后的对象:', copy);// 修改原对象不会影响拷贝对象(对于顶层属性)
obj.a = 10;
console.log('修改原对象顶层属性后的拷贝对象:', copy.a);// 但是对于嵌套对象(浅拷贝),修改会反映在拷贝对象上
obj.b.c = 20;
console.log('修改原对象嵌套属性后的拷贝对象:', copy.b.c);

你会看到合并后的对象、浅拷贝对象以及修改后的输出结果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/46246.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【2024最新】C++扫描线算法介绍+实战例题

扫描线介绍:OI-Wiki 【简单】一维扫描线(差分优化) 网上一维扫描线很少有人讲,可能认为它太简单了吧,也可能认为这应该算在差分里(事实上讲差分的文章里也几乎没有扫描线的影子)。但我认为&am…

简单搭建卷积神经网络实现手写数字10分类

搭建卷积神经网络实现手写数字10分类 1.思路流程 1.导入minest数据集 2.对数据进行预处理 3.构建卷积神经网络模型 4.训练模型,评估模型 5.用模型进行训练预测 一.导入minest数据集 MNIST--->raw--->test-->(0,1,2...) 10个文件夹 MNIST--->raw-…

VRRP虚拟路由冗余技术

VRRP虚拟路由冗余技术:是一种路由容错协议,用于在网络中提供路由器的冗余备份。它通过将多个路由器虚拟成一个虚拟路由器并且多个路由器之间共享一个虚拟IP地址来实现冗余和高可用性。当承担转发业务的主路由器出现故障时,其他备份路由器可以…

git的下载流程,及使用方法,官网地址怎么找?

要下载git以及了解使用方法,可以按照以下步骤进行操作: 打开浏览器,输入git的官方网站地址:https://git-scm.com/(官网地址可能会有变动,请根据最新情况进行搜索)。 在官网上找到下载按钮或链接…

安全防御:防火墙概述

目录 一、信息安全 1.1 恶意程序一般会具备一下多个或全部特点 1.2 信息安全五要素: 二、了解防火墙 2.1 防火墙的核心任务 2.2 防火墙的分类 2.3 防火墙的发展历程 2.3.1 包过滤防火墙 2.3.2 应用代理防火墙 2.3.3 状态检测防火墙 补充防御设备 三、防…

uniapp微信小程序授权登录实现

我们在做小程序的时候用的最多的方式登录 就是原生的授权登录的功能 这个方法 也不是很难 首先我们要获取我们在小程序中的code值 我们小封装一个获取code 的方法 在页面中可以直接调用 封装在 js 中 export const wxlogin () > {return new Promise((resolve, reject…

骑士人才系统74cms专业版实现本地VUE打包和在线升级方法以及常见问题

骑士人才系统我就不多说了目前来说我接触的人才系统里面除了phpyun就是骑士人才了,两个历史都很悠久,总起来说功能方面各分伯仲,前几期我作过Phpyun的配置教程这次我们针对骑士人才系统说说怎么使用VUE源码本地一键打包后台和在线升级方式&am…

展开说说:Android之View基础知识解析

View虽不属于Android四代组件,但应用程度却非常非常广泛。在Android客户端,君所见之处皆是View。我们看到的Button、ImageView、TextView等等可视化的控件都是View,ViewGroup是View的子类因此它也是View。但是现在我们把View和ViewGroup当成两…

每日Attention学习10——Scale-Aware Modulation

模块出处 [ICCV 23] [link] [code] Scale-Aware Modulation Meet Transformer 模块名称 Scale-Aware Modulation (SAM) 模块作用 改进的自注意力 模块结构 模块代码 import torch import torch.nn as nn import torch.nn.functional as Fclass SAM(nn.Module):def __init__…

redisTemplate报错为nil,通过redis-cli查看前缀有乱码

public void set(String key, String value, long timeout) {redisTemplate.opsForValue().set(key, value, timeout, TimeUnit.SECONDS);} 改完之后 public void set(String key, String value, long timeout) {redisTemplate.setKeySerializer(new StringRedisSerializer()…

设计模式--工厂设计模式

什么是工厂模式? 工厂模式是一种创建型设计模式,它定义了一个用于创建对象的接口,但由子类决定要实例化的类是哪一个。这样,工厂方法模式让类的实例化延迟到子类。通过工厂方法模式,我们可以在不修改现有代码的情况下…

opencascade AIS_InteractiveContext源码学习8 trihedron display attributes

AIS_InteractiveContext 前言 交互上下文(Interactive Context)允许您在一个或多个视图器中管理交互对象的图形行为和选择。类方法使这一操作非常透明。需要记住的是,对于已经被交互上下文识别的交互对象,必须使用上下文方法进行…

数据湖仓一体(五)安装spark

上传安装包到/opt/software目录并解压 [bigdatanode106 software]$ tar -zxvf spark-3.3.1-bin-hadoop3.tgz -C /opt/services/ 重命名文件 [bigdatanode106 services]$ mv spark-3.3.1-bin-hadoop3 spark-3.3.1 配置环境变量 [bigdatanode106 ~]$ sudo vim /etc/profile…

最优化(10):牛顿类、拟牛顿类算法

4.4 牛顿类算法——介绍了经典牛顿法及其收敛性,并介绍了修正牛顿法和非精确牛顿法; 4.5 拟牛顿类算法——引入割线方程,介绍拟牛顿算法以及拟牛顿矩阵更新方式,然后给出了拟牛顿法的全局收敛性,最后介绍了有限内存BFG…

Java中创建线程的方式

文章目录 创建线程ThreadRunnableCallable线程池创建方式自定义线程池线程池工作原理阻塞队列线程池参数合理配置线程池参数 创建线程 在Java中创建一个线程,有且仅有一种方式,创建一个Thread类实例,并调用它的start方法。 Thread 最经典也…

在Linux上设置MySQL允许远程连接的完整指南

个人名片 🎓作者简介:java领域优质创作者 🌐个人主页:码农阿豪 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[2435024119qq.com] &#x1f4f1…

构建图像金字塔遍历不同的大小

1、首先、构建金字塔,其中包括从原始图像到多层缩小后的图像。 import cv2# 读取原始图像 image cv2.imread(path_to_image)# 构建高斯金字塔 gaussian_pyramid [image] for i in range(6): # 这里假设构建6层image cv2.pyrDown(image) # 下采样gaussian_p…

【Linux】多线程_6

文章目录 九、多线程7. 生产者消费者模型生产者消费者模型的简单代码结果演示 未完待续 九、多线程 7. 生产者消费者模型 生产者消费者模型的简单代码 Makefile: cp:Main.ccg -o $ $^ -stdc11 -lpthread .PHONY:clean clean:rm -f cpThread.hpp: #i…

vue引入sm-crypto通过sm4对文件进行加解密,用户输入密码

对文件加密并保存: import { sm4 } from sm-cryptofetch("你的文件地址") .then(response > response.blob()) .then(byteStream > {const reader2 new FileReader();reader2.onload function(event) {const arrayBuffer event.target.result;l…

【Linux】Linux必备的基础指令

目录 Linux必备的基础指令一 、 什么是Linux二、 Linux常用命令2.1 ls2.2 pwd2.3 cd2.4 touch2.5 cat2.6 mkdir2.7 rm 三、 Linux重要指令3.1 cp3.2 mv3.3 tail3.4 vim3.5 grep3.6 ps3.7 netstat Linux必备的基础指令 一 、 什么是Linux 系统编程&⽹络编程 Linux⾃⾝提供…