深拷贝
深拷贝是将一个对象从内存中完整的拷贝一份出来,从堆内存中开辟一个新的区域存放新对象,且修改新对象不会影响原对象。
深拷贝代码:
let arr1=[1,2,3,{
username:'ywt'
}];
let arr2=JSON.parse(JSON.stringify(arr1));
arr2[3].username='zgy';
console.log(arr1,arr2);
// arr1 arr2
// (4) [1, 2, 3, {…}] (4) [1, 2, 3, {…}]
// 0: 1 0: 1
// 1: 2 1: 2
// 2: 3 2: 3
// 3: {username: "ywt"} 3: {username: "zgy"}
// length: 4 length: 4
// __proto__: Array(0) __proto__: Array(0)
浅拷贝
浅拷贝是创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型,拷贝的就是基本类型的值,如果属性是引用类型,拷贝的就是内存地址 ,所以如果其中一个对象改变了这个地址,就会影响到另一个对象。
浅拷贝代码:
let obj1={
person:{
name:'YY',
age:21
},
sports:'basketball'
};
let obj2=Object.assign({},obj1);
obj2.person.name='ZZ';
obj2.sports='football';
console.log(obj1);//person: {name: "ZZ", age: 21}sports: "basketball"
总之,深拷贝会另外创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象。浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存。
深度优先遍历(DFS)
深度优先搜索在搜索过程中访问某个顶点后,需要递归地访问此顶点的所有未访问过的相邻顶点。
- 若该相邻节点未被访问,则对其进行标记,并进入递归,查找它的未被标记访问的邻接节点;若该节点已被访问标记,则回退到上级节点,查找它未被标记访问的邻接节点,再进入递归,直到与起点相通的全部顶点都被标记访问为止。
- 若所有节点都被标记访问,就结束;反之,如果还有节点未被访问,则需要以该节点为顶点进行下一步的递归查找,直到所有点都被标记访问。
广度优先遍历(BFS)
广度优先遍历,又称为"宽度优先搜索"或"横向优先搜索",简称 BFS。它的实现思想是:从一点出发,查出它的邻接节点放入队列并标记,然后从队列中弹出第一个节点,寻找它的邻接未被访问的节点放入队列,直至所有已被访问的节点的邻接点都被访问过;若图中还有未被访问的点,则另选一个未被访问的点出发,执行相同的操作,直至图中所有节点都被访问。