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

yizhihongxing

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中创建对象的几种方法,以及它们的使用场景。 1. 使用对象字面量 使用对象字面量方式可以创建一个新的对象,这是一种最简单和常用的方式。对象字面量是由一对花括号({})包含着一个无序的键值对(key:value)列表,其中键名是字符串,值…

    JavaScript 2023年5月27日
    00
  • JavaScript函数节流的两种写法

    JavaScript函数节流的概念是指限制事件触发的频率。例如,我们可以设置函数在一定时间内只能触发一次,这可以在处理一些高频事件时提高页面性能。 在JavaScript实现函数节流的时候,一般有两种常用的写法,下面将会分别进行介绍。 时间戳实现 时间戳实现是通过记录上一次执行的时间,和当前时间进行比较,如果时间差大于设定的时间阈值,就执行函数,否则就不执行…

    JavaScript 2023年5月27日
    00
  • Js参数RSA加密传输之jsencrypt.js的使用

    让我来给您详细讲解“Js参数RSA加密传输之jsencrypt.js的使用”的完整攻略。 什么是RSA加密 RSA加密是一种非对称加密,它的实现需要公钥和私钥两个因子。将消息加密使用的是公钥,而解密需要用到私钥,这样就可以防止信息被中间人截获。RSA加密算法常用于保护数据在传输的过程中不能被恶意拦截或窃取。在Web开发中,RSA加密常常用于加密用户的个人信息…

    JavaScript 2023年5月19日
    00
  • js中console在一行内打印字符串和对象的方法

    在JavaScript中,我们常常需要在控制台(console)输出调试信息,其中输出的内容可能是一些字符串、数字和对象等。有时候我们想要将多个输出信息连成一行,这时候就可以使用一些方法来实现。 1. 使用字符串拼接符号 ‘+’ 在JavaScript中,我们可以使用字符串拼接符号 ‘+’ 来将多个字符串拼接在一起,例如: console.log(‘hell…

    JavaScript 2023年5月28日
    00
  • WEB 浏览器兼容 推荐收藏

    下面是关于WEB浏览器兼容推荐收藏的完整攻略。 什么是WEB 浏览器兼容? WEB浏览器兼容是指一种 WEB 站点可被多种浏览器在不同操作系统环境下展现,且表现基本一致的能力。WEB的兼容性是 WEB 应用开发中最为重要的成果之一,无论是在美观还是用户体验上都占据重要地位。 为什么需要WEB 浏览器兼容? 随着不同操作系统和不同版本的浏览器的出现,WEB 在…

    JavaScript 2023年6月10日
    00
  • 利用JS提交表单的几种方法和验证(必看篇)

    下面是关于“利用JS提交表单的几种方法和验证”的完整攻略: 1. 提交表单的几种方法 1.1 提交按钮直接调用submit方法 当在表单中设置了type=”submit”的按钮,在点击按钮时,会自动提交表单。同时,我们也可以通过js手动触发按钮的点击事件,从而提交表单。 例如,我们有一个表单: <form id="myForm" a…

    JavaScript 2023年6月10日
    00
  • JavaScript数学对象Math操作数字的方法

    我可以给你详细讲解JavaScript数学对象Math操作数字的方法的攻略。 1. Math的基本信息 在JavaScript中,我们可以使用Math对象来进行数学计算。而Math对象是一个不必实例化就可以使用的对象,即它是一个全局对象。Math对象提供了很多用于数学计算的方法,例如三角函数、指数、对数、乘方、四舍五入、取整等等。在数学的各种操作中,Math…

    JavaScript 2023年5月27日
    00
  • 学习javascript面向对象 理解javascript对象

    学习 JavaScript 面向对象编程(OOP)是成为一名 JavaScript 开发者的重要一步。理解 JavaScript 对象是理解 OOP 的基础。以下是学习 JavaScript 面向对象编程并理解 JavaScript 对象的完整攻略: 1. 了解面向对象编程 面向对象编程是将程序分解成一系列相互关联的对象。对象具有属性和方法,可以相互通信和交…

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