JavaScript对象拷贝与赋值操作实例分析

yizhihongxing

JavaScript对象拷贝与赋值操作实例分析

在JavaScript中,对象的赋值与拷贝是一个非常重要的话题。这篇文章将会分析对象的赋值与拷贝两种操作的差异以及使用场景,并通过实例展示它们的不同表现。

基本数据类型与引用数据类型

在JavaScript中,数据类型可分为基本数据类型和引用数据类型。基本数据类型包括NumberStringBooleannullundefined,而引用数据类型包括ObjectArrayFunctionDate等等。

  • 基本数据类型:基本数据类型的变量储存的是实际的值,通过变量对基本类型数据进行操作时,修改的是变量本身的值。
let a = 1;
let b = a;
b = 2;
console.log(a); // 1
console.log(b); // 2
  • 引用数据类型:引用数据类型的变量储存的是一个指针,指向该数据类型在内存中被储存的地址,通过变量对引用类型数据进行操作时,修改的是内存中的数据。
let arr1 = [1, 2];
let arr2 = arr1;
arr2.push(3);
console.log(arr1); // [1, 2, 3]
console.log(arr2); // [1, 2, 3]

对象的赋值与拷贝

赋值操作

在JavaScript中,对象的赋值操作是指将一个对象的引用赋值给另一个变量。当两个变量引用的是同一对象时,其中一个变量修改该对象,另一个变量也会受到影响。

示例代码如下所示:

let obj1 = {
  name: 'John',
  age: 20
};
let obj2 = obj1;
obj2.age = 22;
console.log(obj1); // { name: 'John', age: 22 } 修改age变量值
console.log(obj2); // { name: 'John', age: 22 }

在上述示例中,当修改obj2中的age值时,obj1中对应的值也发生了改变。因为obj1obj2都指向同一个内存地址。

拷贝操作

在JavaScript中,对象的拷贝是指将一个对象的值复制到另一个对象中。当拷贝完成后,两个对象之间互不影响。

浅拷贝

浅拷贝是将一个对象的属性值拷贝到一个新的对象中,但是新对象的属性值仍然是对原对象属性值的引用。

举个例子:

let obj1 = {
  name: 'John',
  age: 20
};
let obj2 = {};
for(let key in obj1){
  if(obj1.hasOwnProperty(key)){
    obj2[key] = obj1[key];
  }
}
obj2.age = 22;
console.log(obj1); // { name: 'John', age: 20 }
console.log(obj2); // { name: 'John', age: 22 }

在上述示例中,当修改obj2中的age值时,obj1中对应的值并没有改变,并且obj2也没有对obj1产生影响。

深拷贝

深拷贝是指递归地将一个对象及其子对象进行拷贝,完全复制一个新对象,新对象跟原对象不存在任何关系。

下面示例演示了如何通过JSON.parse(JSON.stringify(obj))实现深拷贝:

let obj1 = {
  name: 'John',
  age: 20,
  friend: {
    name: 'Tom',
    age: 18
  }
};
let obj2 = JSON.parse(JSON.stringify(obj1));
obj2.friend.age = 20;
console.log(obj1); // { name: 'John', age: 20, friend: { name: 'Tom', age: 18 } }
console.log(obj2); // { name: 'John', age: 20, friend: { name: 'Tom', age: 20 } }

在上述示例中,当修改obj2中的friend对象的age属性时,obj1中的对应值仍然保持不变,它们互不影响。

总结

  • 对于基本数据类型,赋值和拷贝的操作保持相同的效果,即变量之间相互独立,修改其中一个变量不会影响其他变量。
  • 对于引用数据类型,赋值和拷贝的操作效果不同。赋值是将两个变量引用同一个内存地址,它们之间存在关联。而拷贝是将一个对象的值复制到另一个对象中,使它们变得完全相互独立。
  • 对于浅拷贝,虽然生成了一个新的对象,但是新对象的属性仍然是对原对象属性的引用,因此当修改新对象属性时也会影响原对象。
  • 对于深拷贝,递归地将原对象及其子对象进行复制,生成一个新的对象,彻底解除了原对象与新对象之间的关联,保证二者相互独立。

以上就是JavaScript对象拷贝与赋值操作的详细分析。该攻略中包含了基本数据类型与引用数据类型的区别,赋值与拷贝两种操作的差异以及使用场景,并通过实例演示了浅拷贝和深拷贝两种实现方式的不同表现。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaScript对象拷贝与赋值操作实例分析 - Python技术站

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

相关文章

  • Move.js入门

    Move.js入门攻略 什么是Move.js Move.js是一个轻量级的JavaScript动画库,用于实现Web页面中的动画效果。它支持常用的CSS动画属性以及自定义路径和缓动效果,同时具有跨浏览器兼容性和高性能特点。 安装Move.js 可以通过以下两种方式来安装Move.js: 从官方网站下载move.min.js文件并引入到HTML文件中: &lt…

    JavaScript 2023年6月10日
    00
  • JavaScript格式化日期时间的方法和自定义格式化函数示例

    JavaScript格式化日期时间的方法和自定义格式化函数示例 在JavaScript中,格式化日期时间是一个常见的需求。本文将介绍在JavaScript中格式化日期时间的方法和自定义格式化函数示例。 提供内置的日期时间格式化方法 在JavaScript中,可以使用Date对象提供的内置方法来格式化日期时间。以下是一些常见的方法及其描述: getFullYe…

    JavaScript 2023年5月27日
    00
  • js的回调函数详解

    JS的回调函数详解 在Javascript中,回调函数(callback function)指的是一个函数作为另一个函数的参数,然后在这个函数执行完后,再执行这个函数。回调函数经常用到异步编程中。 回调函数的定义 回调函数作为一种设计模式,是把一个函数作为参数传递给另一个函数,让这个函数在另一个函数完成后调用。 回调函数的作用 回调函数主要用于异步编程。当一…

    JavaScript 2023年5月27日
    00
  • jquery无法设置checkbox选中即没有变成选中状态

    当使用 jQuery 设置一个 checkbox 的选中状态时,在某些情况下可能会出现并没有设置成功的情况,通常是因为没有正确理解 checkbox 的3种状态:选中(checked)、未选中(unchecked)和半选状态(indeterminate)。 首先,我们需要明确 checkbox 的3种状态,如果一个 checkbox 没有设置“选中”或“未选…

    JavaScript 2023年6月10日
    00
  • srcElement表格样式

    srcElement 表示事件源对象,即触发该事件的元素。通过该属性,我们可以对事件源对象执行一些操作,比如修改元素的样式等。 在表格中,我们可以利用该属性来修改表格的样式,下面提供两个示例说明。 示例一:通过鼠标悬浮事件修改表格行背景色 <table> <tr> <th>姓名</th> <th>年…

    JavaScript 2023年6月10日
    00
  • 一文详解JS私有属性的6种实现方式

    一文详解JS私有属性的6种实现方式 在JavaScript中,我们可以使用不同的方法来实现私有属性。私有属性是指只能在类内部访问,并且不能在类外部访问的属性。下面将详细介绍JS私有属性的6种实现方式。 1. 使用Symbol来实现私有属性 Symbol是ES6新增的数据类型,它是一种不可变的数据类型,用于作为对象属性的唯一标识符,从而避免了属性名冲突。在类的…

    JavaScript 2023年5月27日
    00
  • javascript实现字符串反转的方法

    JavaScript实现字符串反转的方法 在JavaScript中,我们可以使用以下几种方式来实现字符串反转。 1. 利用split()和reverse()方法 使用JavaScript中的split()方法可以将字符串转换为一个字符数组,而数组中可以使用reverse()方法来反转字符数组,最后再使用join()方法将字符数组转成字符串。 function…

    JavaScript 2023年5月28日
    00
  • JavaScript防止表单重复提交的方法

    针对JavaScript防止表单重复提交的方法,下面我将为您详细说明相关攻略。 1. 前置知识 在介绍防止表单重复提交的方法之前,你需要掌握一下几个前置知识: 1.1 同步和异步 同步和异步是指程序在执行任务的时候,是否等待上一个任务执行完毕。同步任务会等待上一个任务执行完成,而异步任务则不会阻塞程序的执行。 1.2 发送Ajax请求 Ajax是异步Java…

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