JavaScript浅拷贝

一、什么是浅拷贝

在JavaScript中,浅拷贝是一种将源对象的属性复制到目标对象中的方法。浅拷贝的实现方式有多种,包括直接赋值、Object.assign()、展开运算符、concat()等。浅拷贝会复制对象的引用,而不是对象本身,因此如果源对象和目标对象共享一个属性值,该属性值的更改将会影响到源对象和目标对象。

二、直接赋值

直接赋值是最简单的浅拷贝方法,它将源对象的属性值直接复制到目标对象中。但是,它只适用于简单的对象和数组,并会复制对象的引用。

  const sourceObj = {name: 'Alice', age: 30};
  const targetObj = sourceObj;
  console.log(targetObj); // {name: 'Alice', age: 30}
  targetObj.name = 'Bob';
  console.log(sourceObj); // {name: 'Bob', age: 30}

三、Object.assign()

Object.assign() 方法用于将一个或多个源对象的属性值复制到目标对象中,并返回目标对象。该方法也只能复制对象的引用。

  const sourceObj = {name: 'Alice', age: 30};
  const targetObj = Object.assign({}, sourceObj);
  console.log(targetObj); // {name: 'Alice', age: 30}
  targetObj.name = 'Bob';
  console.log(sourceObj); // {name: 'Alice', age: 30}

四、展开运算符

展开运算符可以用于将对象或数组中的属性值复制到一个新对象或数组中。但是,它只能复制对象的引用。

  const sourceObj = {name: 'Alice', age: 30};
  const targetObj = {...sourceObj};
  console.log(targetObj); // {name: 'Alice', age: 30}
  targetObj.name = 'Bob';
  console.log(sourceObj); // {name: 'Alice', age: 30}

五、concat()

对于数组,可以使用concat()将一个数组的所有元素复制到一个新数组中。但是,它只能复制数组中的元素,而不能复制对象。

  const sourceArr = [1, 2, 3];
  const targetArr = sourceArr.concat();
  console.log(targetArr); // [1, 2, 3]
  targetArr[0] = 4;
  console.log(sourceArr); // [1, 2, 3]

六、浅拷贝的局限性

由于浅拷贝只复制了对象的引用,因此在处理复杂对象或嵌套对象时,需要考虑其他方法,例如深拷贝或使用一些第三方库。

七、深拷贝

深拷贝是一种将源对象的所有属性及其值复制到新对象中的方法,它不会复制对象的引用。但是,由于深拷贝涉及到递归,因此可能会对性能造成影响。

  function deepClone(obj) {
    if (typeof obj !== 'object' || obj === null) return obj;
    const newObj = obj instanceof Array ? [] : {};
    for (let key in obj) {
      if (obj.hasOwnProperty(key)) {
        newObj[key] = deepClone(obj[key]);
      }
    }
    return newObj;
  }

  const sourceObj = {name: 'Alice', age: 30};
  const targetObj = deepClone(sourceObj);
  console.log(targetObj); // {name: 'Alice', age: 30}
  targetObj.name = 'Bob';
  console.log(sourceObj); // {name: 'Alice', age: 30}

八、第三方库

第三方库可以提供更强大的浅拷贝和深拷贝功能,例如lodash的clone()、cloneDeep()和merge()方法。

  const sourceObj = {name: 'Alice', age: 30};
  const targetObj = _.clone(sourceObj);
  console.log(targetObj); // {name: 'Alice', age: 30}
  targetObj.name = 'Bob';
  console.log(sourceObj); // {name: 'Alice', age: 30}

  const sourceObj = {name: 'Alice', age: 30, address: {city: 'Shanghai', zipcode: 200000}};
  const targetObj = _.cloneDeep(sourceObj);
  console.log(targetObj); // {name: 'Alice', age: 30, address: {city: 'Shanghai', zipcode: 200000}}
  targetObj.address.city = 'Beijing';
  console.log(sourceObj); // {name: 'Alice', age: 30, address: {city: 'Shanghai', zipcode: 200000}}

  const sourceObj = {name: 'Alice', age: 30, phone: ['13812345678', '13987654321']};
  const targetObj = _.merge({}, sourceObj, {phone: ['13600000000']});
  console.log(targetObj); // {name: 'Alice', age: 30, phone: ['13600000000', '13987654321']}
  console.log(sourceObj); // {name: 'Alice', age: 30, phone: ['13812345678', '13987654321']}

九、总结

JavaScript中的浅拷贝是一种将源对象的属性复制到目标对象中的方法。直接赋值、Object.assign()、展开运算符、concat()等是常见的浅拷贝方法,但它们只能复制对象的引用,因此需要注意对源对象和目标对象共享属性值时的影响。对于深层次的对象或嵌套对象,需要考虑使用深拷贝或第三方库。

原创文章,作者:JIQPA,如若转载,请注明出处:https://www.506064.com/n/372946.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
JIQPAJIQPA
上一篇 2025-04-25 15:26
下一篇 2025-04-25 15:26

相关推荐

  • 使用JavaScript日期函数掌握时间

    在本文中,我们将深入探讨JavaScript日期函数,并且从多个视角介绍其应用方法和重要性。 一、日期的基本表示与获取 在JavaScript中,使用Date对象来表示日期和时间,…

    编程 2025-04-28
  • JavaScript中使用new Date转换为YYYYMMDD格式

    在JavaScript中,我们通常会使用Date对象来表示日期和时间。当我们需要在网站上显示日期时,很多情况下需要将Date对象转换成YYYYMMDD格式的字符串。下面我们来详细了…

    编程 2025-04-27
  • JavaScript中修改style属性的方法和技巧

    一、基本概念和方法 style属性是JavaScript中一个非常重要的属性,它可以用来控制HTML元素的样式,包括颜色、大小、字体等等。这里介绍一些常用的方法: 1、通过Java…

    编程 2025-04-25
  • JavaScript中的Object.getOwnPropertyDescriptors()

    一、简介 Object.getOwnPropertyDescriptors()是JavaScript中一个非常有用的工具。简单来说,这个方法可以获取一个对象上所有自有属性的属性描述…

    编程 2025-04-25
  • CloneDeep函数在Javascript开发中的应用

    一、CloneDeep的概念 CloneDeep函数在Javascript中是一种深层克隆对象的方法,可以在拷贝对象时避免出现引用关系。使用者可以在函数中设置可选参数使其满足多种拷…

    编程 2025-04-25
  • JavaScript保留整数的完整指南

    JavaScript是一种通用脚本语言,非常适合Web应用程序开发。在处理数字时,JavaScript可以处理整数和浮点数。在本文中,我们将重点关注JavaScript如何保留整数…

    编程 2025-04-25
  • JavaScript点击事件全方位指南

    一、click事件基础 click事件是最常用的鼠标事件之一,当元素被单击时触发。click事件适用于大多数HTML元素(<a>、<button>)和SVG…

    编程 2025-04-25
  • 详解JavaScript onclick事件

    一、onclick的基础知识 onclick事件是JavaScript中最常用的事件之一,它在用户点击某个HTML元素时触发。通常我们可以通过给元素添加一个onclick属性来绑定…

    编程 2025-04-25
  • JavaScript 数组转成字符串

    一、数组转成字符串的基本操作 在 JS 中,将数组转成字符串是一项最基本但也最常见的操作之一。我们可以使用 Array 类型内置的 join() 方法实现。它将数组的元素连接成一个…

    编程 2025-04-25
  • 使用asyncjs优化JavaScript应用程序性能

    一、异步执行的必要性 JavaScript是一种单线程语言,这意味着JavaScript程序在执行任何操作时都必须等待上一个操作的完成才能开始下一个操作。因此,如果有一个比较慢的操…

    编程 2025-04-25

发表回复

登录后才能评论