对象的属性方法和深浅拷贝

简介: 总结,理解对象的属性和方法对于编程是基础而重要的,而掌握深浅拷贝的差异和使用场合则是编程的高级技能,它能帮助你有效地管理数据的完整性和独立性。

当我们处理JavaScript中的对象时,了解对象的属性和方法以及如何正确地进行深浅拷贝是至关重要的。

对象的属性和方法

对象是JavaScript中的一个基本数据结构,它用来存储一系列的“键值对”。对象的属性是这些键值对中的“键”,它可以关联一个值,这个值可以是基本数据类型如数字、字符串或者是复杂数据类型如另一个对象和函数(此时被称为方法)。

例如,一个人员对象可以有如下属性和方法:

let person = {
  name: "John",
  age: 30,
  greet: function() {
    console.log("Hello, " + this.name);
  }
};

// 访问对象的属性
console.log(person.name); // 输出: John
// 调用对象的方法
person.greet(); // 输出: Hello, John

在以上示例中,nameageperson对象的属性,而 greet方法则为该对象定义了一个行为(即在控制台打印问候语)。

深浅拷贝

在JavaScript中,由于对象是引用类型的数据,直接将一个对象赋值给另一个变量时,实际上复制的是内存地址的引用,而不是对象本身。因此,对其中一个对象的修改会影响到另一个。为了避免这一点,可以使用浅拷贝或深拷贝。

  • 浅拷贝会创建一个新对象,它的属性是原始对象属性值的一个引用(如果属性是基本类型,则复制值),这意味着如果属性值本身是一个对象的话,新对象的这个属性值会和原始对象的属性值指向同一个对象。

实现浅拷贝方式有多种,如使用 Object.assign()方法或者展开运算符 ...

let original = { name: "John", details: { age: 30 } };

// 使用Object.assign进行浅拷贝
let copy = Object.assign({}, original);

// 使用展开运算符进行浅拷贝
let copy2 = {...original};

在以上两种浅拷贝中,originalcopydetails属性指向相同的对象,修改 copy.details.age会影响到 original.details.age

  • 深拷贝生成一个新对象,新对象的属性是原始对象属性值的一个完整副本,包括嵌套的对象。

深拷贝可以通过 JSON.parse(JSON.stringify(object))实现,这种方式易于实现,但它不能复制函数和原型链上的属性。

let original = { name: "John", details: { age: 30 } };

// 使用JSON转换实现深拷贝
let deepCopy = JSON.parse(JSON.stringify(original));

// 修改deepCopy不会影响原始对象
deepCopy.details.age = 35;
console.log(original.details.age); // 输出仍然是30

需要注意的是,JSON.parse(JSON.stringify(object))方法在处理含有日期对象、函数、undefined、循环引用等情况时可能不适用或会抛出错误。在这些情况下,你可能需要使用库如lodash的 _.cloneDeep()方法进行深拷贝,或者需要编写自定义函数来处理复杂对象的深拷贝。

总结,理解对象的属性和方法对于编程是基础而重要的,而掌握深浅拷贝的差异和使用场合则是编程的高级技能,它能帮助你有效地管理数据的完整性和独立性。

目录
相关文章
|
3月前
|
C++
C++番外篇——对于继承中子类与父类对象同时定义其析构顺序的探究
C++番外篇——对于继承中子类与父类对象同时定义其析构顺序的探究
68 1
对象的相等和引用相等的区别
对象的相等和引用相等的区别
方法引用符、引用类方法、引用对象的实例方法、引用类的实例方法及引用构造器
方法引用符、引用类方法、引用对象的实例方法、引用类的实例方法及引用构造器
100 0
歪理解?原型链中的函数和对象
最近在看高程4,原型链肯定是绕不过的,本瓜之前一直认为,只要记住这句话就可以了: 一个对象的隐式原型(__proto__)等于构造这个对象的构造函数的显式原型(prototype)
|
算法 Java 编译器
如何理解对象赋值给接口的操作(关键在对象!)
如何理解对象赋值给接口的操作(关键在对象!)
如何理解对象赋值给接口的操作(关键在对象!)
|
Java
java面试题:当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
答:是值传递。Java编程语言只有值传递参数。 当一个对象实例作为一个参数被传递到方法中时,参数的值就是该对象的引用一个副本。指向同一个对象,对象的内容可以在被调用的方法中改变,但对象的引用(不是引用的副本)是永远不会改变的。
12622 0
|
Python
Python编程:获取一个类对象的属性和方法
Python编程:获取一个类对象的属性和方法
150 0
|
Java 数据库
java反射机制查找类的属性并赋值
先说一下需求:最近做一个项目其中需要将前台传来的数组存到数据库,但是这个表里有15个字段,集合是不固定的,然后要把这个集合的数值赋给这个类的相应属性,然后存到数据库中。集合长度应小于等于这个类属性的个数。
338 0
|
Java 编译器
方法引用的那些事儿
一句话介绍: > **方法引用**(**_Method Reference_**)是在 Lambda 表达式的基础上引申出来的一个功能。 先不铺展概念,从一个示例开始说起。 # 一、小示例 ```java List list = Arrays.asList(1, 2, 3); list.forEach(num -> System.out.println(num));
454 0
|
Java
构造器、对象数组、对象属性、静态实例块、this关键字
它的名字:构造函数、构造方法、初始化方法。 构造条件? 以后我们如何去使用构造器? 你觉得那些对象中那些属性值是必要的,你就在构造器中提出来(就是你如果想创造对象必须要传入我所需要的参数) public class Dog {//这里就是一个简单的类、狗的类 String name; .
1199 0