当前位置:首页 > 文章列表 > 文章 > 前端 > JavaScriptObject.assign使用方法详解

JavaScriptObject.assign使用方法详解

2025-08-02 18:18:29 0浏览 收藏

**JavaScript Object.assign 用法详解:对象合并的利器与陷阱** `Object.assign()` 是 JavaScript 中用于合并对象属性的常用方法,它通过浅拷贝的方式将源对象的可枚举属性复制到目标对象,并返回修改后的目标对象。本文将深入解析 `Object.assign()` 的用法,包括如何避免修改原始对象、理解浅拷贝的特性及其局限性、以及深拷贝的实现方案。此外,还会探讨 `Object.assign()` 在处理 Symbol 类型属性和 `null`/`undefined` 值时的行为。掌握这些细节,能帮助开发者更高效、安全地使用 `Object.assign()`,避免潜在的错误,提升代码质量。无论是前端开发还是 Node.js 开发,理解并掌握 `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 }

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《JavaScriptObject.assign使用方法详解》文章吧,也可关注golang学习网公众号了解相关技术文章。

JavaScript逻辑赋值运算符使用技巧JavaScript逻辑赋值运算符使用技巧
上一篇
JavaScript逻辑赋值运算符使用技巧
Laravel数组添加元素方法详解
下一篇
Laravel数组添加元素方法详解
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    543次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    514次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    499次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    484次学习
查看更多
AI推荐
  • SEO  AI Mermaid 流程图:自然语言生成,文本驱动可视化创作
    AI Mermaid流程图
    SEO AI Mermaid 流程图工具:基于 Mermaid 语法,AI 辅助,自然语言生成流程图,提升可视化创作效率,适用于开发者、产品经理、教育工作者。
    700次使用
  • 搜获客笔记生成器:小红书医美爆款内容AI创作神器
    搜获客【笔记生成器】
    搜获客笔记生成器,国内首个聚焦小红书医美垂类的AI文案工具。1500万爆款文案库,行业专属算法,助您高效创作合规、引流的医美笔记,提升运营效率,引爆小红书流量!
    711次使用
  • iTerms:一站式法律AI工作台,智能合同审查起草与法律问答专家
    iTerms
    iTerms是一款专业的一站式法律AI工作台,提供AI合同审查、AI合同起草及AI法律问答服务。通过智能问答、深度思考与联网检索,助您高效检索法律法规与司法判例,告别传统模板,实现合同一键起草与在线编辑,大幅提升法律事务处理效率。
    733次使用
  • TokenPony:AI大模型API聚合平台,一站式接入,高效稳定高性价比
    TokenPony
    TokenPony是讯盟科技旗下的AI大模型聚合API平台。通过统一接口接入DeepSeek、Kimi、Qwen等主流模型,支持1024K超长上下文,实现零配置、免部署、极速响应与高性价比的AI应用开发,助力专业用户轻松构建智能服务。
    797次使用
  • 迅捷AIPPT:AI智能PPT生成器,高效制作专业演示文稿
    迅捷AIPPT
    迅捷AIPPT是一款高效AI智能PPT生成软件,一键智能生成精美演示文稿。内置海量专业模板、多样风格,支持自定义大纲,助您轻松制作高质量PPT,大幅节省时间。
    688次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议隐私政策
返回登录
  • 重置密码