当前位置:首页 > 文章列表 > 文章 > 前端 > JavaScript中Object.assign用法详解

JavaScript中Object.assign用法详解

2025-07-20 10:21:16 0浏览 收藏

欢迎各位小伙伴来到golang学习网,相聚于此都是缘哈哈哈!今天我给大家带来《JavaScript中使用Object.assign合并对象的方法》,这篇文章主要讲到等等知识,如果你对文章相关的知识非常感兴趣或者正在自学,都可以关注我,我会持续更新相关文章!当然,有什么建议也欢迎在评论留言提出!一起学习!

Object.assign() 是浅拷贝,用于合并对象属性,但不修改原始对象的方法是使用空对象作为目标;其执行的是浅拷贝,不会复制嵌套对象的引用;深拷贝可通过 JSON.parse(JSON.stringify(obj))、递归函数或第三方库如 lodash 的 _.cloneDeep 实现;它仅复制可枚举的自有属性,包括可枚举的 Symbol 属性;当目标为 null 或 undefined 时会抛出错误,而源对象为 null 或 undefined 时则被忽略。1. 使用 Object.assign({}, obj1, obj2) 可避免修改原对象;2. 它是浅拷贝,嵌套对象会被引用而非复制;3. 深拷贝方法包括 JSON 转换、递归实现和第三方库;4. 仅复制可枚举的自有属性;5. 目标不能为 null 或 undefined,否则抛出 TypeError,源为 null 或 undefined 则跳过。

JavaScript如何用Object.assign合并对象

Object.assign() 方法通过复制一个或多个源对象的所有可枚举的自有属性到目标对象,然后返回修改后的目标对象。它是一种浅拷贝的方式,可以用来合并对象,但需要注意一些细节。

JavaScript如何用Object.assign合并对象

解决方案

Object.assign() 的基本语法是 Object.assign(target, ...sources)。其中,target 是目标对象,也是修改后的对象将要返回的。sources 是一个或多个源对象,它们的属性将被复制到目标对象。

JavaScript如何用Object.assign合并对象

例如:

const target = { a: 1, b: 2 };
const source = { b: 4, c: 5 };

const returnedTarget = Object.assign(target, source);

console.log(target); // 输出: { a: 1, b: 4, c: 5 }
console.log(returnedTarget); // 输出: { a: 1, b: 4, c: 5 }
console.log(target === returnedTarget); // 输出: true

在这个例子中,source 对象的属性 bc 被复制到 target 对象。由于 target 对象已经有属性 b,所以 source 对象的 b 属性覆盖了 target 对象的 b 属性。Object.assign 直接修改了 target 对象,并且返回了修改后的 target 对象。

JavaScript如何用Object.assign合并对象

如何避免修改原始对象?

Object.assign 会直接修改目标对象。如果不想修改原始对象,可以先创建一个空对象作为目标对象:

const obj1 = { a: 1 };
const obj2 = { b: 2 };
const obj3 = { c: 3 };

const mergedObj = Object.assign({}, obj1, obj2, obj3);

console.log(mergedObj); // 输出: { a: 1, b: 2, c: 3 }
console.log(obj1); // 输出: { a: 1 } (obj1 未被修改)

这样,mergedObj 将会是一个新的对象,包含了 obj1obj2obj3 的所有属性,而原始对象 obj1obj2obj3 不会被修改。

Object.assign 是深拷贝还是浅拷贝?

Object.assign 执行的是浅拷贝。这意味着如果源对象的属性值是一个对象,那么只会复制对象的引用,而不会创建一个新的对象。

看下面的例子:

const obj1 = { a: 1, b: { c: 2 } };
const obj2 = { d: 3 };

const mergedObj = Object.assign({}, obj1, obj2);

console.log(mergedObj); // 输出: { a: 1, b: { c: 2 }, d: 3 }

obj1.b.c = 4; // 修改 obj1 的 b 属性的 c 属性

console.log(mergedObj); // 输出: { a: 1, b: { c: 4 }, d: 3 }

在这个例子中,mergedObj.bobj1.b 指向的是同一个对象。所以,当我们修改 obj1.b.c 的值时,mergedObj.b.c 的值也会被修改。这就是浅拷贝的特性。

如何进行深拷贝?

如果需要进行深拷贝,可以使用以下方法:

  1. JSON.parse(JSON.stringify(obj)):这种方法简单粗暴,但是有一些限制。例如,它不能拷贝函数、undefined 和 Symbol 类型的属性。

    const obj1 = { a: 1, b: { c: 2 }, d: function() {} };
    const clonedObj = JSON.parse(JSON.stringify(obj1));
    
    console.log(clonedObj); // 输出: { a: 1, b: { c: 2 } } (函数 d 丢失)
  2. 递归实现深拷贝:这种方法可以处理更复杂的情况,但是需要编写更多的代码。

    function deepClone(obj) {
      if (typeof obj !== 'object' || obj === null) {
        return obj;
      }
    
      const clonedObj = Array.isArray(obj) ? [] : {};
    
      for (let key in obj) {
        if (obj.hasOwnProperty(key)) {
          clonedObj[key] = deepClone(obj[key]);
        }
      }
    
      return clonedObj;
    }
    
    const obj1 = { a: 1, b: { c: 2 }, d: function() {} };
    const clonedObj = deepClone(obj1);
    
    console.log(clonedObj); // 输出: { a: 1, b: { c: 2 }, d: function() {} } (函数 d 被正确拷贝,但引用不同)
    
    obj1.b.c = 4;
    console.log(obj1); // 输出: { a: 1, b: { c: 4 }, d: function() {} }
    console.log(clonedObj); // 输出: { a: 1, b: { c: 2 }, d: function() {} } (clonedObj 未被修改)
  3. 使用第三方库:例如 lodash 的 _.cloneDeep() 方法。

    const _ = require('lodash');
    
    const obj1 = { a: 1, b: { c: 2 }, d: function() {} };
    const clonedObj = _.cloneDeep(obj1);
    
    console.log(clonedObj); // 输出: { a: 1, b: { c: 2 }, d: function() {} }
    
    obj1.b.c = 4;
    console.log(obj1); // 输出: { a: 1, b: { c: 4 }, d: function() {} }
    console.log(clonedObj); // 输出: { a: 1, b: { c: 2 }, d: function() {} } (clonedObj 未被修改)

Object.assign 的性能如何?

Object.assign 的性能通常是可以接受的,但在处理大量对象或大型对象时,性能可能会成为一个问题。在这种情况下,可以考虑使用其他方法,例如手动循环复制属性,或者使用专门的库来优化性能。

Object.assign 可以合并 Symbol 类型的属性吗?

Object.assign 可以合并 Symbol 类型的属性,但是只有可枚举的 Symbol 类型的属性才会被复制。

const obj1 = {
  a: 1,
  [Symbol('foo')]: 2
};

const obj2 = {
  b: 3,
  [Symbol('bar')]: 4
};

Object.defineProperty(obj2, Symbol('bar'), {
  value: 5,
  enumerable: false // 设置为不可枚举
});

const mergedObj = Object.assign({}, obj1, obj2);

console.log(mergedObj); // 输出: { a: 1, b: 3, [Symbol(foo)]: 2 } (只有可枚举的 Symbol 属性被复制)

Object.assign 如何处理 null 和 undefined?

targetnullundefined 时,Object.assign 会抛出 TypeError 错误。当 sourcenullundefined 时,Object.assign 会跳过这些源对象,不会抛出错误。

try {
  Object.assign(null, { a: 1 }); // 抛出 TypeError
} catch (e) {
  console.log(e); // 输出: TypeError: Cannot convert undefined or null to object
}

const obj = Object.assign({}, null, { a: 1 }, undefined, { b: 2 });

console.log(obj); // 输出: { a: 1, b: 2 }

今天关于《JavaScript中Object.assign用法详解》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

多模态AI如何解析植物表型数据多模态AI如何解析植物表型数据
上一篇
多模态AI如何解析植物表型数据
Lambda表达式使用详解与技巧
下一篇
Lambda表达式使用详解与技巧
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    542次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    511次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    498次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    484次学习
查看更多
AI推荐
  • 扣子空间(Coze Space):字节跳动通用AI Agent平台深度解析与应用
    扣子-Space(扣子空间)
    深入了解字节跳动推出的通用型AI Agent平台——扣子空间(Coze Space)。探索其双模式协作、强大的任务自动化、丰富的插件集成及豆包1.5模型技术支撑,覆盖办公、学习、生活等多元应用场景,提升您的AI协作效率。
    8次使用
  • 蛙蛙写作:AI智能写作助手,提升创作效率与质量
    蛙蛙写作
    蛙蛙写作是一款国内领先的AI写作助手,专为内容创作者设计,提供续写、润色、扩写、改写等服务,覆盖小说创作、学术教育、自媒体营销、办公文档等多种场景。
    11次使用
  • AI代码助手:Amazon CodeWhisperer,高效安全的代码生成工具
    CodeWhisperer
    Amazon CodeWhisperer,一款AI代码生成工具,助您高效编写代码。支持多种语言和IDE,提供智能代码建议、安全扫描,加速开发流程。
    25次使用
  • 畅图AI:AI原生智能图表工具 | 零门槛生成与高效团队协作
    畅图AI
    探索畅图AI:领先的AI原生图表工具,告别绘图门槛。AI智能生成思维导图、流程图等多种图表,支持多模态解析、智能转换与高效团队协作。免费试用,提升效率!
    52次使用
  • TextIn智能文字识别:高效文档处理,助力企业数字化转型
    TextIn智能文字识别平台
    TextIn智能文字识别平台,提供OCR、文档解析及NLP技术,实现文档采集、分类、信息抽取及智能审核全流程自动化。降低90%人工审核成本,提升企业效率。
    61次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议隐私政策
返回登录
  • 重置密码