JS赋值、浅拷贝和深拷贝(数组和对象的深浅拷贝)实例详解

JS赋值、浅拷贝和深拷贝

在JavaScript开发中,我们经常需要对变量进行赋值操作,同时还需要将对象或数组复制到另一个变量中。这些操作看起来很简单,但如果不理解JavaScript中变量存储的方式,就容易引出一些微妙的问题。本文将简单介绍JS赋值、浅拷贝和深拷贝。

JS赋值

JS赋值操作可以将一个变量的值赋给另一个变量。这是一种基本的操作,也是很容易看懂的。例如:

let a = 1;
let b = a; //将变量a的值赋给变量b

在这个例子中,变量b存储着变量a的值,它们指向的是同一个内存地址,因此b的值可以随着a的修改而变化。这就是JS中的变量赋值。

浅拷贝

浅拷贝,是指创建一个新的对象或数组,保存了从原始对象或数组直接继承的属性和值。但对于对象和数组等引用类型,只复制它们的引用,而不是实际的对象或数组。这样,如果原始对象或数组发生了变化,那么浅复制的对象或数组也会跟着变化。例如:

let arr1 = [1, 2, 3];
let arr2 = arr1; //将arr1的值赋给arr2

arr1[0] = 4;
console.log(arr2[0]); //输出4

在这个例子中,arr2实际上是arr1的引用,他们指向的是同一个内存地址。当我们修改arr1的第一个元素后,arr2也跟着发生了改变。这就是JS中的浅拷贝。

对象和数组的浅拷贝

下面,我们来看一下如何对JavaScript中的对象和数组进行浅拷贝。

对象的浅拷贝

下面是一个简单的例子,展示了如何使用Object.assign()方法对对象进行浅拷贝。

let obj1 = { a: 1, b: 2 };
let obj2 = Object.assign({}, obj1);

console.log(obj2); // {a: 1, b: 2}

在这个例子中,我们创建了一个新的空对象,然后使用Object.assign()方法将原始对象(即obj1)的属性和值复制到了新的对象中。这就是对象的浅拷贝。

数组的浅拷贝

下面是一个简单的例子,展示了如何对JavaScript中的数组进行浅拷贝。

let arr1 = [1, 2, 3];
let arr2 = arr1.slice();

console.log(arr2); // [1, 2, 3]

在这个例子中,我们使用slice()方法来创建一个新的数组,该数组包含原始数组中的所有元素。这就是数组的浅拷贝。

深拷贝

深拷贝,是指复制对象或数组本身,而不是它们内部的子对象或数组。与浅拷贝不同,深拷贝创建了一个完全独立的对象或数组,它们的内容和原始对象或数组完全相同。这意味着,即使原始对象或数组发生变化,深复制的对象或数组也不会发生任何变化。例如:

let obj1 = {
  a: 1,
  b: {
    c: 2
  }
};

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

console.log(obj2); // {a: 1, b: {c: 2}}

在这个例子中,我们使用JSON.parse()方法将对象obj1转换为JSON字符串,然后再使用JSON.stringify()方法将JSON字符串转换为新的对象obj2。由于这种方法创建了完全独立的对象,所以obj2的内容和obj1完全相同。这就是JS中的深拷贝。

对象和数组的深拷贝

下面,我们来看一下如何对JavaScript中的对象和数组进行深拷贝。

对象的深拷贝

这里我们采用递归的方式进行深拷贝操作。例如:

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

let obj1 = {
  a: 1,
  b: {
    c: 2
  }
};

let obj2 = deepClone(obj1);

console.log(obj2); // {a: 1, b: {c: 2}}

在这个例子中,我们使用了递归函数deepClone()来复制对象,该函数对于对象中包含的所有属性和值进行递归操作,直到所有的值都被复制到新的对象中。这就是对象的深拷贝。

数组的深拷贝

这里我们采用递归的方式进行深拷贝操作。例如:

function deepClone(arr) {
    let newArr = [];
    for (let i = 0; i < arr.length; i++) {
        if(typeof arr[i] === 'object') {
            newArr[i] = deepClone(arr[i]);
        } else {
            newArr[i] = arr[i];
        }
    }
    return newArr;
}

let arr1 = [1, 2, [3, 4]];

let arr2 = deepClone(arr1);

console.log(arr2); // [1, 2, [3, 4]]

在这个例子中,我们使用了递归函数deepClone()来复制数组,该函数对于数组中包含的所有元素进行递归操作,直到所有的元素都被复制到新的数组中。这就是数组的深拷贝。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JS赋值、浅拷贝和深拷贝(数组和对象的深浅拷贝)实例详解 - Python技术站

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

相关文章

  • 最新版JavaScript中的箭头函数

    当我们使用JavaScript编写代码时,函数是一种非常重要的语言特性。在最新版本的JavaScript中,引入了箭头函数,这是一种更加简洁和优雅的函数声明方式。在本文中,我们将详细讲解什么是箭头函数以及如何使用箭头函数。 什么是箭头函数? 箭头函数是一种新的函数语法,它可以用更短的代码书写函数。它使用箭头语法 (=>) 声明函数。箭头函数可以用来声明…

    JavaScript 2023年5月27日
    00
  • JS数组(Array)处理函数整理

    JS数组(Array)处理函数整理 在JavaScript中,数组(Array)是非常常见且重要的数据类型。它可以用来存储一组有序的数据,方便数据的访问以及数据的操作。本文将对常用的JS数组处理函数进行整理,并给出一些示例说明。 forEach() forEach()方法是一个数组的遍历方法,可以用来依次访问数组中的元素,并对每一个元素执行给定的操作。用法如…

    JavaScript 2023年5月27日
    00
  • url参数中有+、空格、=、%、&、#等特殊符号的问题解决

    针对url参数中包含特殊符号导致的问题,可以采取以下措施进行解决: 一、使用URL编码 URL编码是将URL中的非英文字母和数字都用百分号(%)加两个16进制数字表示的方式进行转换,以确保它们能够正常传输和处理。常用的URL编码方法是使用Javascript内置对象encodeURIComponent()函数。例如: https://www.example.…

    JavaScript 2023年5月19日
    00
  • javascript document.referrer 用法

    Javascript中,document.referrer属性用于获取上一页面的URL地址。具体来说,它返回一个字符串,即访问当前页面的用户从哪个URL过来的。这个属性可以提供有用的信息,比如可以用于跟踪用户的来源,或者可以用于判断用户是否从一些关键页面跳转过来。 下面是使用document.referrer属性的完整攻略。 1. 使用document.re…

    JavaScript 2023年6月11日
    00
  • JavaScript实现文件上传demo

    <!DOCTYPE html> <html lang=”en”> <head> <meta charset=”UTF-8″> <meta http-equiv=”X-UA-Compatible” content=”IE=edge”> <meta name=”viewport” content=…

    JavaScript 2023年4月18日
    00
  • django admin 使用SimpleUI自定义按钮弹窗框示例

    下面是“django admin 使用SimpleUI自定义按钮弹窗框示例”的完整攻略以及其中的两个示例说明。 1. 什么是SimpleUI SimpleUI是一个漂亮的开源后台管理系统框架,提供了众多易于扩展和修改的组件和插件,能够使开发者快速开发高效的后台管理系统。 2. 使用SimpleUI自定义按钮弹窗框示例 在django admin中,我们可以利…

    JavaScript 2023年6月11日
    00
  • vue打开新窗口并实现传参的图文实例

    下面是“vue打开新窗口并实现传参的图文实例”的完整攻略。 1. 前置知识 在学习“vue打开新窗口并实现传参”的过程中,需要掌握以下前置知识: Vue.js基础知识 HTML基础知识 JavaScript基础知识 2. 实现步骤 2.1 打开新窗口 打开新窗口有多种方式,这里使用window.open()方法来实现。 window.open(url, ‘_…

    JavaScript 2023年6月11日
    00
  • JS实现简易日历效果

    下面是详细讲解JS实现简易日历效果的完整攻略。 1.准备工作 在开始之前,我们需要准备以下工作: 一个HTML文件,用于展示日历 一个CSS文件,用于美化页面 一个JS文件,用于实现日历功能 2.HTML结构 我们需要在HTML中添加以下结构: <div class="calendar"> <div class=&quo…

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