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实现计算圆周率到小数点后100位的方法示例

    首先我们需要知道如何计算圆周率。圆周率是一个无理数,用希腊字母π表示,它的值约为3.14159265358979323846。 对于JavaScript实现计算圆周率到小数点后100位的方法,我们可以使用莱布尼兹公式来完成,公式如下: π/4=1-1/3+1/5-1/7+1/9-1/11+… 其中,π是我们要求的圆周率。 在实现过程中,我们将公式求和10…

    JavaScript 2023年5月28日
    00
  • 浅谈Javascript中Object与Function对象

    JavaScript中的所有数据都是对象,包括Object对象和Function对象。但是Object与Function对象不同,Object对象主要用于存储数据,而Function对象主要用于封装一些代码,实现逻辑的封装与复用。 Object对象 在JavaScript中,Object对象是所有对象的基类,其它对象都继承了Object对象。Object对象…

    JavaScript 2023年5月27日
    00
  • js创建对象几种方式的优缺点对比

    那我来讲解一下“js创建对象几种方式的优缺点对比”的攻略。 什么是对象? 在 JavaScript 中,万物皆对象。简单来说,对象就是一种数据类型,它是由一组“键值对”组成的组合数据类型。每个键都是唯一的,其对应的值可以是任何基本类型的数据,还可以是对象、数组等复杂类型的数据。 对象的创建方式 在 JavaScript 中,创建对象的方式有多种,下面分别来介…

    JavaScript 2023年5月27日
    00
  • javascript引导程序

    JavaScript引导程序是一种在HTML文档加载时立即执行的代码块。这种代码块一般用于页面初始化,为用户提供更好的用户体验。下面我将为你详细讲解如何编写和使用JavaScript引导程序。 编写JavaScript引导程序 编写JavaScript引导程序需要遵循以下步骤: 在HTML文档内添加一个script元素。 给script元素添加type属性,…

    JavaScript 2023年5月19日
    00
  • js实现鼠标悬浮框效果

    JavaScript 实现鼠标悬浮框效果的过程主要分为以下几步: 1. 创建 HTML 结构 首先需要在 HTML 中定义框架,例如容器、容器内的内容、触发事件的 DOM 元素等。其中包含一个容器作为悬浮框,在鼠标触发事件后自动显示,同时鼠标移出事件后自动隐藏。 例如: <div class="parent"> <but…

    JavaScript 2023年6月11日
    00
  • JS简单获取日期相差天数的方法

    下面是”JS简单获取日期相差天数的方法”的完整攻略。 标题 步骤1:获取两个日期并计算它们之间的毫秒数 首先,我们需要获取两个日期,并计算它们之间的毫秒数。代码如下: const date1 = new Date("2021-03-01") const date2 = new Date("2021-03-05") co…

    JavaScript 2023年5月27日
    00
  • 微信小程序tabBar模板用法实例分析【附demo源码下载】

    微信小程序tabBar模板用法实例分析 简介 本文将介绍微信小程序的tabBar模板用法,并提供一个demo供下载。 tabBar模板 tabBar模板可以让开发者更方便地实现小程序的底部导航栏功能。tabBar可以包含2-5个按钮,每个按钮对应一个不同的页面。当用户点击按钮时,小程序会自动跳转到相应的页面。 tabBar模板的常用属性有以下几个: back…

    JavaScript 2023年6月11日
    00
  • JavaScript程序中实现继承特性的方式总结

    若要在JavaScript程序中实现继承特性,可以采用以下几种方式: 一、原型继承 1. 基础概念 原型继承是指利用原型链来实现对象之间的继承关系。每个JavaScript对象都有一个内部属性__proto__,用于指向创建它的构造函数的原型对象,从而构成原型链。 2. 实现方式 function Parent() { this.name = ‘parent…

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