第一模块:课程名称:直面JavaScript中的30个疑难杂症 ;章节:2-4~2-6;讲师名称:公明2020
第二模块,第三模块:
浅拷贝值复制对象的引用地址,而不是复制对象本身,新旧对象还是共享一个引用地址,但是深拷贝会创造一个一模一样的对象,新对象不会和就对象共享内存,修改新对象不会影响旧对象。
1.浅拷贝:
定义:创建一个新对象,这个对象有原始对象的属性值的一份精确拷贝,如果是基本数据的话拷贝的就是它的值,如果数引用数据类型,拷贝的就是它的堆内存的地址,修改一个对象 会影响另一个对象。值是相同的,但是地址也是新开辟的。
浅拷贝的几种方法:
(1)Object.assign()
对Object.assign而言如果对象的属性值为简单的类型(number,stringify)通过Object.assign()得到的新对象为深拷贝,如果属性值为对象或者其他的引用类型,对这个对象来说就是浅拷贝
Object.assign({},src,src1)对于src src1之间相同的属性是直接覆盖的,如果属性值为对象的话,是不会对对象之间的属性进行合并的
(2)slice和concat
只有一层的时候是深拷贝
深浅拷贝举例: 假设B复制了A,当修改A时,看B是否会发生变化,如果B也跟着变了,说明时浅拷贝。 如果B没变,那就是深拷贝。 // 遍历 var obj={ a:"hello", b:{ a:"world", b:111, }, c:[11,'Jack','Tom'] } // function simpleClone(objNew){ var obj={}; for(var i on objNew){ obj[i]=objNew[i] } return obj; } var objCopy=simpleClone(obj); onjCopy.b.a='world1'; console.log(obj); console.log(objCopy); // Object.creat() var objCopy=Object.create(obj);
var obj1 = { name: 'mimi', age: 2.5, like: ['eat','fight','sleep'] }; // 第一种浅拷贝的方法,直接复制 var obj2 = obj1; // 第二种浅拷贝的方法,把obj1中的多有对象复制到obj2中 var obj3 = {}; function shallowCopy(obj, targetObj){ for (const key in obj) { targetObj[key] = obj[key]; } } shallowCopy(obj1, obj3); console.log(obj3);// {name: "mimi", age: 2.5,like:["eat", "fight", "sleep", "haha"]} console.log(obj1);// {name: "mimi", age: 2.5,like:["eat", "fight", "sleep", "haha"]} obj1.like.push('haha'); console.log(obj3.like);//["eat", "fight", "sleep", "haha"]
3.深拷贝是另外一个对象开辟对应的空间,是两个不同的对象。
数组方法:slice、concat都是深拷贝。
JSON.parse(JSON.stringify(obj))
Object.assign()是一种可以对非嵌套对象进行深拷贝的方法,如果对象中出现嵌套情况,那么其对被嵌套对象的行为就成了普通的浅拷贝。
第四模块: