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日

相关文章

  • 一文搞懂JavaScript中原型与原型链

    一文搞懂JavaScript中原型与原型链 在JavaScript中,每个对象都有一个原型对象,这个对象可以拥有自身的属性和方法,并且还可以指向另一个原型对象,称为原型链。理解原型和原型链的概念,对于JavaScript的面向对象编程是非常重要的。在本文中,我们将详细讲解JavaScript中原型和原型链的概念及其实现方式。 原型 在JavaScript中,…

    JavaScript 2023年6月10日
    00
  • javascript之AJAX框架使用说明

    JavaScript之AJAX框架使用说明 什么是AJAX? AJAX(Asynchronous JavaScript and XML)指的是一种创建交互式 Web 应用程序的技术。使用 AJAX,JavaScript 和 XMLHttpRequest 对象一起实现无刷新数据更新。 使用 AJAX 可以在不重新加载整个页面的情况下,与服务器交换数据并更新部分…

    JavaScript 2023年6月11日
    00
  • JavaScript运算符小结

    JavaScript运算符小结 本文主要介绍JavaScript中各种运算符的用法和特点,包括算术运算符、比较运算符、逻辑运算符等。 算术运算符 JavaScript中的常见算术运算符包括+、-、*、/、%等,分别表示加、减、乘、除、取余操作。其中,+符号还有连接字符串的功能。 示例: var a = 10; var b = 3; console.log(a…

    JavaScript 2023年5月28日
    00
  • 返回函数的JavaScript函数

    返回函数的JavaScript函数指函数内部定义了一个或多个函数,并将其中一个函数作为返回值。这种方式可以使我们在维护函数时更加容易,同时也可以实现更加灵活的编程。 下面,我们将分别从函数内部定义函数和返回函数两个方面对这种方式进行详细讲解。 函数内部定义函数 在JavaScript中,我们可以在一个函数内部定义另一个函数。例如,如下代码中的outerFun…

    JavaScript 2023年5月28日
    00
  • vue整合百度地图显示指定地点信息

    下面我会为您介绍Vue整合百度地图显示指定地点信息的完整攻略。 步骤一:申请百度地图开发者账号和JavaScript API密钥 首先需要申请百度地图开发者账号,然后在开发者中心获取JavaScript API密钥。 步骤二:安装百度地图JavaScript API SDK 在Vue项目中使用npm安装百度地图JavaScript API SDK,并在Vue…

    JavaScript 2023年5月19日
    00
  • 详解JavaScript自定义函数

    请看下面的详解: 详解 JavaScript 自定义函数 在 JavaScript 中,函数是一种可被调用的代码块,它可以重复使用,是提高代码复用率的重要手段。JavaScript 中的函数不仅可以使用已有的内置函数,还可以通过自定义函数实现更多的功能。 一、自定义函数的基本定义 JavaScript 中的自定义函数使用 function 关键字定义,其基本…

    JavaScript 2023年5月27日
    00
  • 详解超简单的react服务器渲染(ssr)入坑指南

    我来为你详细讲解“详解超简单的react服务器渲染(ssr)入坑指南”的完整攻略。 什么是SSR SSR(Server-Side Rendering,服务器端渲染)是指在服务器端使用Node.js等技术来进行React组件的渲染工作,将页面渲染成HTML字符串后返回给浏览器,使浏览器能够更快速地呈现页面,提升用户体验。 SSR的优劣 相比于客户端渲染(CSR…

    JavaScript 2023年6月11日
    00
  • ThinkPHP表单数据智能写入create方法实例分析

    我来详细讲解一下“ThinkPHP表单数据智能写入create方法实例分析”的完整攻略。 什么是ThinkPHP表单数据智能写入create方法? 在ThinkPHP框架中,使用create方法可以将表单数据智能写入到数据库中。这个方法可以将表单中的数据自动映射到对应的模型属性中,并且会过滤掉一些非法的字段,确保插入的数据安全可靠。 怎样使用create方法…

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