详解JavaScript对象的深浅复制

请参考以下完整攻略。

1. JavaScript对象的深浅复制

JavaScript中的对象赋值,涉及到两种复制方法:浅复制和深复制。

浅复制只复制变量对象本身及其属性的引用,针对基本数据类型是深复制,对于复杂数据类型则是浅复制。而深拷贝会完全复制原始对象和嵌套的所有对象,也就是说,新创建的对象与原始对象没有任何关联。

2. 浅复制

浅复制的实现方式有对象的解构赋值、Object.assign()方法和直接使用等三种。

2.1 对象的解构赋值

对象的解构赋值是通过赋值的方式将对象的属性直接取出来。用浅拷贝来打出对象a的属性,并将属性赋到对象b。

let a = {name: 'Jack', age: 20, hobby: ['reading', 'coding']}; 
let b = {...a};
console.log(b === a); //false
a.hobby.push('writing');
console.log(a.hobby); //[ 'reading', 'coding', 'writing' ]
console.log(b.hobby); //[ 'reading', 'coding', 'writing' ]

从上面的代码输出可以看到,改动了a对象,b对象也会受到影响。

2.2 Object.assign()方法

Object.assign() 方法会将所有可枚举属性的值从一个或多个源对象复制到目标对象。它会返回目标对象。

let a = {name: 'Jack', age: 20, hobby: ['reading', 'coding']}; 
let b = Object.assign({}, a);
console.log(b === a); //false
a.hobby.push('writing');
console.log(a.hobby); //[ 'reading', 'coding', 'writing' ]
console.log(b.hobby); //[ 'reading', 'coding', 'writing' ]

通过示例代码可以看到,与使用对象解构方法一样,当我们改动了a对象中的属性时,b对象也会受到影响,因此Object.assign()方法也是一种浅拷贝方法。

2.3 直接复制

直接复制会产生两个具有相同属性的变量,但是它们并不是同一个变量,而且改变其中任意一个的属性,并不会影响另一个变量。

let a = {name: 'Jack', age: 20, hobby: ['reading', 'coding']}; 
let b = a;
console.log(b === a); //true
a.hobby.push('writing');
console.log(a.hobby); //[ 'reading', 'coding', 'writing' ]
console.log(b.hobby); //[ 'reading', 'coding', 'writing' ]

从上面的代码输出可以看到,改动了a对象,b对象也会受到影响,因此直接复制方法也是一种浅拷贝方法。

3. 深复制

深复制的实现方式有JSON.parse(JSON.stringify())、手动递归、第三方库等常见的几种。

3.1 JSON.parse(JSON.stringify())

其中一个最常见的深拷贝对象的方式是使用JSON处理。定义一个JSON序列化再反序列化的过程来复制对象。

let a = {name: 'Jack', age: 20, hobby: ['reading', 'coding']}; 
let b = JSON.parse(JSON.stringify(a));
console.log(b === a); //false
a.hobby.push('writing');
console.log(a.hobby); //[ 'reading', 'coding', 'writing' ]
console.log(b.hobby); //[ 'reading', 'coding' ]

从上面的代码输出可以看到,此时改动了a对象后,b对象并不会受到影响,因此我们成功实现了深拷贝。

需要注意的是,这种深拷贝方式只支持纯JSON可以表示的数据类型,而对于函数、RegExp、Date等这些无法转成JSON对应的数据类型,会被忽略。

3.2 手动递归

手动递归深拷贝对象也是一种常见的方式,具体实现步骤如下:

function deepClone(obj) {
  if (typeof obj !== 'object' || obj === null) {
    return obj;
  }
  let clone = Array.isArray(obj) ? [] : {};
  for (const key in obj) {
    if (Object.prototype.hasOwnProperty.call(obj, key)) {
      clone[key] = deepClone(obj[key]);
    }
  }
  return clone;
}

以上是手动递归深拷贝对象的示例代码。

3.3 第三方库

除了上述两种深拷贝对象的方法,还有一些第三方库也可以完成这些操作,如lodash等,使用起来比较简单。

4. 总结

本文对JavaScript中的对象深浅复制做了详细的讲解,通过示例代码介绍了各种实现方式的特点和使用方法。对于不同的场景和需要,可以选择不同的方式来进行复制,以很好地满足需求并提高开发效率。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解JavaScript对象的深浅复制 - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • js 字符串转换成数字的三种方法

    以下是完整攻略。 JavaScript字符串转换成数字的三种方法 在JavaScript中,字符串可以转换成数字。下面介绍三种常用的字符串转换成数字的方法。 方法一:使用parseInt()函数 可以使用parseInt()函数将字符串转换成整数,这个函数的语法如下: parseInt(string, radix) 其中, string:要被转换成数字的字符…

    JavaScript 2023年5月28日
    00
  • 用js实现轮播图效果

    实现轮播图效果的一般思路: 1.准备好轮播图所需的HTML结构:容器元素、轮播图图片、圆点等。 2.通过CSS实现轮播图的样式,包括图片的大小、位置、圆点的样式等。 3.通过JavaScript实现轮播图的功能,包括自动播放、手动切换、圆点切换等。 以下是具体的实现步骤和代码示例: 一、HTML结构 HTML结构一般包括轮播图容器元素、图片元素及圆点元素,如…

    JavaScript 2023年6月11日
    00
  • 突袭HTML5之Javascript API扩展3—本地存储全新体验

    突袭HTML5之Javascript API扩展3—本地存储全新体验 什么是本地存储 本地存储是 HTML5 新增的一个功能,可以让我们在客户端本地浏览器中存储数据,而无需借助服务器实现存储,该技术包含 localStorage 和 sessionStorage 两种技术。 localStorage 和 sessionStorage 的不同之处在于 loca…

    JavaScript 2023年6月11日
    00
  • js注入 黑客之路必备!

    JS注入是Web安全领域中非常重要的一个议题,也是Web攻击中常用的一种手段。攻击者可以通过JS注入攻击网站或用户,包括窃取用户信息、篡改网页内容、控制用户会话等。 以下是一个简单的JS注入攻击示例: 攻击目标 我们以一个简单的登录页面(login.html)为目标页面,该页面通过使用jQuery库将用户名和密码传递给后台验证,并在验证失败时显示错误提示。页…

    JavaScript 2023年5月19日
    00
  • 谈谈JavaScript数组常用方法总结

    谈谈JavaScript数组常用方法总结 1. 什么是JavaScript数组 JavaScript数组可以理解为一组有序的数据集合,可以存储任意类型的数据,包括数字、字符串、对象、函数等等。数组是JavaScript中最常用的数据结构之一,因为它能够快速方便地对数据进行排序、搜索、过滤、截取等操作。 2. JavaScript数组常用方法 下面列举了一些常…

    JavaScript 2023年5月18日
    00
  • JavaScript中的私有/静态属性介绍

    当我们谈到JavaScript中的“私有”和“静态”属性时,我们实际上是在谈论不同类型的属性。 私有属性 私有属性是指只能在类的内部使用的属性。这意味着它们不能通过类的实例或外部访问。为了理解私有属性,让我们来看一个简单的例子: class Person { #name = ”; set name(name) { this.#name = name; } …

    JavaScript 2023年6月10日
    00
  • javascript jQuery $.post $.ajax用法

    下面是关于JavaScript jQuery中$.post和$.ajax用法的详细攻略。 什么是 jQuery? jQuery 是 Javascript 中的一种框架,可以方便地操作 HTML 文档、处理事件、制作动画方法等。jQuery 中提供了很多常用的函数和方法,使用它可以更加高效、简洁地编写Javascript代码。 jQuery 的 $.post …

    JavaScript 2023年5月27日
    00
  • JavaScript自定义函数用法详解

    JavaScript自定义函数用法详解 在 JavaScript 中,函数是一个非常重要的概念。函数可以让代码更加可读可维护,代码的重用性也更高。本文将详细介绍 JavaScript 中自定义函数的用法,包括函数的定义、调用、参数、返回值等。 函数的定义 在 JavaScript 中定义函数有两种方式:函数声明和函数表达式。 函数声明 函数声明是最常见的方式…

    JavaScript 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部