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中iframe实现局部刷新的几种方法汇总

    JavaScript中iframe实现局部刷新的几种方法汇总 简介 iFrame 是HTML中的一种标记,可以使网页中嵌套其他网页。iFrame 的应用非常广泛,可以用于实现局部刷新,即只刷新部分页面的内容,而不用刷新整个页面。这对于提高网站加载速度和用户体验非常有帮助。本文将介绍几种方法来实现iFrame的局部刷新。 方法一:修改iFrame src属性 …

    JavaScript 2023年6月10日
    00
  • JavaScript中两个字符串的匹配

    JavaScript中两个字符串的匹配,通常可以使用字符串的match()方法、search()方法和正则表达式来实现。 使用match()方法进行字符串匹配 字符串的match()方法可以将一个正则表达式与一个字符串进行匹配,并返回匹配结果。其语法如下: string.match(regexp); 其中,regexp可以是一个字符串或者正则表达式对象。下面…

    JavaScript 2023年5月28日
    00
  • 使用Javascript和DOM Interfaces来处理HTML

    处理HTML主要是通过DOM(Document Object Model)来完成的,DOM是HTML文档的编程接口,通过DOM,可以进行对网页内容的增删改查。 以下是使用Javascript和DOM Interfaces处理HTML的完整攻略: 1. 获取HTML元素 通过Javascript获取HTML元素的方法如下: let element = docu…

    JavaScript 2023年6月10日
    00
  • extjs4图表绘制之折线图实现方法分析

    关于“extjs4图表绘制之折线图实现方法分析”的完整攻略,我将给你详细讲解。 1. 前言 折线图是常用的一种图表类型,它可以帮助我们展示数据的变化趋势和规律。而在extjs4中,我们也可以轻松地利用其中的图表组件来绘制折线图。下面是具体实现步骤。 2. 准备工作 在开始绘制折线图之前,我们需要做一些准备工作。 首先,我们需要导入extjs4中的chart.…

    JavaScript 2023年6月10日
    00
  • 实例讲解Cookies欺骗与session欺骗入侵

    实例讲解Cookies欺骗与session欺骗入侵是一种常见的网络攻击手段,攻击者通过伪造Cookies或者Session,绕过网站的身份认证机制,获取其他用户的登录凭证或者直接盗取用户数据。下面我们就来详细讲解这个攻击手段的攻击方式、防御措施以及两条常见攻击示例。 什么是Cookies欺骗与session欺骗入侵? 1. Cookies欺骗入侵 Cooki…

    JavaScript 2023年6月11日
    00
  • 跟我学习javascript的this关键字

    当编写 JavaScript 代码时,经常会使用 this 关键字。它可以引用当前上下文中的对象,其行为特点是动态绑定。但是,该关键字在不同的上下文环境中使用可能会产生不同的结果,这常常导致初学者的困惑。本文将深入讲解 JavaScript 的 this 关键字, 帮助初学者理解并正确运用它。 1. this关键字指向全局对象 在全局环境中,使用 this …

    JavaScript 2023年6月10日
    00
  • JavaScript实现表单验证案例

    下面我将详细讲解JavaScript实现表单验证的完整攻略。这个攻略将分为以下几个部分: 规划表单验证的流程和步骤 编写JavaScript代码实现表单验证 示例说明1:验证用户名和密码 示例说明2:验证邮箱地址格式 规划表单验证的流程和步骤 在开始编写JavaScript代码之前,我们需要先规划表单验证的流程和步骤。一般情况下,表单验证的流程如下: 获取表…

    JavaScript 2023年6月10日
    00
  • Javascript Date toDateString() 方法

    以下是关于JavaScript Date对象的toDateString()方法的完整攻略,包括两个示例说明。 JavaScript Date对象的toDateString()方法 JavaScript的toDateString()方法返回一个表示对象日期部分的字符串,该字符串格式为英文的星期几、英文的月份、日期和年份。 下面是使用对象的toDateStrin…

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