javascript深拷贝的几种情况总结

JavaScript深拷贝的几种情况总结

在 JavaScript 中,对于对象的赋值,常常会遇到浅拷贝和深拷贝的问题。浅拷贝只复制对象的引用,而深拷贝则是复制对象的值。这篇文章将总结 JavaScript 中深拷贝的几种情况以及对应的实现方法。

基本数据类型

字符串、数值、布尔类型(string, number, boolean)

基本数据类型的深拷贝非常简单,只需要把值赋给新的变量即可。

let str = 'hello';
let num = 123;
let bool = true;

let str2 = str;
let num2 = num;
let bool2 = bool;

以上代码中,str2num2bool2 分别是 strnumbool 的深拷贝。

null 和 undefined

nullundefined 是 JavaScript 中的特殊值,它们并不是对象,也不是基本数据类型,因此没有值可以深拷贝。

引用数据类型

数组(Array)

对于数组的深拷贝,可以使用 Array.from() 或者 spread operator

let arr = [1, 2, 3];

let arr2 = Array.from(arr);
let arr3 = [...arr];

以上代码中,arr2arr3 分别是 arr 的深拷贝。

对象(Object)

对于对象的深拷贝,可以使用 JSON.parse(JSON.stringify()),但是要注意该方法会忽略对象中的函数、undefinedsymbol 等。

let obj = {
  name: 'Alice',
  age: 18,
  children: [
    {
      name: 'Bob',
      age: 1,
    },
    {
      name: 'Charlie',
      age: 2,
    },
  ],
};

let obj2 = JSON.parse(JSON.stringify(obj));

以上代码中,obj2obj 的深拷贝。

自定义对象

对于自定义对象,可以通过递归实现深拷贝。

function deepCopy(obj) {
  if (typeof obj !== 'object' || obj === null) {
    return obj;
  }

  let result;

  if (Array.isArray(obj)) {
    result = [];
  } else {
    result = {};
  }

  for (let key in obj) {
    if (Object.prototype.hasOwnProperty.call(obj, key)) {
      result[key] = deepCopy(obj[key]);
    }
  }

  return result;
}

let obj = {
  name: 'Alice',
  age: 18,
  children: [
    {
      name: 'Bob',
      age: 1,
    },
    {
      name: 'Charlie',
      age: 2,
    },
  ],
};

let obj2 = deepCopy(obj);

以上代码中,obj2obj 的深拷贝。

示例说明

示例一

let obj = {
  name: 'Alice',
  age: 18,
  friends: {
    name: 'Bob',
    age: 19,
  },
};

let obj2 = JSON.parse(JSON.stringify(obj));
obj2.friends.age = 20;

console.log(obj);   // { name: 'Alice', age: 18, friends: { name: 'Bob', age: 19 } }
console.log(obj2);  // { name: 'Alice', age: 18, friends: { name: 'Bob', age: 20 } }

在以上代码中,objobj2 都是对象,通过 JSON.parse(JSON.stringify()) 实现深拷贝。但是,当我们改变 obj2.friends.age 的值时,obj 的值不会受到影响,这说明 JSON.parse(JSON.stringify()) 并不是完全的深拷贝。

示例二

let arr = [
  {
    name: 'Alice',
    age: 18,
  },
  {
    name: 'Bob',
    age: 19,
  },
];

let arr2 = Array.from(arr);
arr2[0].age = 20;

console.log(arr);   // [ { name: 'Alice', age: 18 }, { name: 'Bob', age: 19 } ]
console.log(arr2);  // [ { name: 'Alice', age: 20 }, { name: 'Bob', age: 19 } ]

在以上代码中,arrarr2 都是数组,通过 Array.from() 实现深拷贝。但是,当我们改变 arr2[0].age 的值时,arr 的值也会发生变化,这说明 Array.from() 并不是完全的深拷贝。

注意以上两个示例在深拷贝过程中的缺陷,应该根据具体情况选择合适的深拷贝方式。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:javascript深拷贝的几种情况总结 - Python技术站

(0)
上一篇 2023年6月10日
下一篇 2023年6月10日

相关文章

  • JS将时间秒转换成天小时分钟秒的字符串

    要将时间秒转换成天小时分钟秒的字符串,可以分别计算出总共的天数、小时数、分钟数和剩余的秒数,并将其拼接成字符串。 下面是一条完整的攻略: 步骤1:计算总共的天数 首先,我们可以将总的时间秒转换成天数,可以使用以下公式: var day = Math.floor(seconds / (3600 * 24)); 这里使用了 Math.floor() 方法来将结果…

    JavaScript 2023年5月27日
    00
  • WebGL 多重纹理的使用介绍

    请听我详细介绍“WebGL 多重纹理的使用介绍”的攻略。 简介 WebGL 多重纹理是用于在 WebGL 应用程序中使用多个纹理的技术。通过多重纹理,可以在同一对象上一次性使用多个纹理图像,并在每个图像之间进行混合或叠加。这为绘制更逼真的 3D 场景提供了更多的灵活性和可能性。 多重纹理的基本概念 在 WebGL 中,多重纹理主要涉及两个核心概念:纹理单元和…

    JavaScript 2023年6月11日
    00
  • javascript实现数组中的内容随机输出

    下面是Javascript实现数组中内容随机输出的完整攻略: 1. 生成随机数 Javascript标准库中有一个Math对象,可以使用Math.random()方法生成[0,1)之间的随机数。那么我们只需要将这个数乘以数组的长度,然后向下取整,就可以得到一个数组下标的随机数。 var arr = [‘apple’, ‘banana’, ‘orange’, …

    JavaScript 2023年5月27日
    00
  • 本地存储localStorage用法详解

    本地存储localStorage用法详解 什么是本地存储localStorage 本地存储localStorage是HTML5中提供的一种新的在客户端存储数据的机制,与cookie相比,localStorage有以下优点: 存储容量更大:cookie一般只能存储4KB左右的数据,而localStorage可以存储更大数据(5MB或以上)。 可以存储复杂的数据…

    JavaScript 2023年6月11日
    00
  • Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法总结

    JQuery是一种JavaScript库,其中包括了许多有用的工具方法,其中包括四种数据请求方法:$.get(), $.post(), $.ajax(), $.getJSON()。以下是它们的详细讲解: $.get(url, data, success, dataType) url:请求的URL地址 data:发送给服务器的数据(可以省略) success:…

    JavaScript 2023年5月19日
    00
  • JQuery将字符串转为json对象的四种方法

    下面是详细的讲解: 背景 在开发过程中,我们经常需要将字符串转换成 JSON 对象,然后进行操作。而 JQuery 提供了四种方法来完成这项任务。下面我们逐一来了解这四种方法。 方法一:$.parseJSON() 这是最常用的方法,直接调用这个方法即可将字符串转换为 JSON 对象。 var str = ‘{"name": "张…

    JavaScript 2023年5月27日
    00
  • Javascript继承机制的设计思想分享

    Javascript继承机制的设计思想分享 概述 Javascript是一门基于原型实现的语言,继承机制是Javascript的核心概念之一。本文将讲述Javascript继承机制的设计思想和实现方式,为读者提供全面的知识体系。 原型链 Javascript的继承机制是基于原型链实现的,原型链是一种基于对象的链式结构。每个Javascript对象都有一个指向…

    JavaScript 2023年6月11日
    00
  • javascript使用for循环批量注册的事件不能正确获取索引值的解决方法

    当使用 for 循环批量注册事件时,经常会遇到无法正确捕获循环变量 i 的问题。这是因为循环结束后,i 的值会变成循环内最后一个迭代的值。这个问题通常称为 JavaScript 的闭包问题。下面是一个简单的示例说明: <!DOCTYPE html> <html> <head> <title>for循环注册事件示…

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