JS的赋值与深浅拷贝实例
//基本数据类型赋值var a = 10;var b = a;a ;console.log(a); // 11console.log(b); // 10//引用数据类型赋值let a = { name: '11' }let b = ab.name = '22'console.log(a.name) // 22console.log(b.name) // 22
注意:浅拷贝只复制一层对象的属性
*语法:Object.assign(target, ...sources) *
ES6中拷贝对象的方法,接受的第一个参数target是拷贝后的对象,剩下的参数是要拷贝的对象sources(可以是多个)
例1:
let target = {};let source = {a:'11',b:{name:'duoduo'}};Object.assign(target ,source);console.log(target); // { a: '11', b: { name: 'duoduo' } }
例2:
let target = {};let source = {a:'11',b:{name:'duoduo'}};Object.assign(target ,source);source.a = '22';source.b.name = 'nana'console.log(source); // { a: '22', b: { name: 'nana' } }console.log(target); // { a: '11', b: { name: 'nana' } }
Object.assign注意事项
实现原数组的浅拷贝
var a = [ 1, 3, 5, { x: 1 } ];var b = Array.prototype.slice.call(a);b[0] = 2;console.log(a); // [ 1, 3, 5, { x: 1 } ];console.log(b); // [ 2, 3, 5, { x: 1 } ];// 从输出结果可以看出,浅拷贝后,数组a[0]并不会随着b[0]改变而改变// 说明a和b在栈内存中引用地址并不相同。
var a = [ 1, 3, 5, { x: 1 } ];var b = Array.prototype.slice.call(a);b[3].x = 2;console.log(a); // [ 1, 3, 5, { x: 2 } ];console.log(b); // [ 1, 3, 5, { x: 2 } ];// 从输出结果可以看出,浅拷贝后,数组中对象的属性会根据修改而改变// 说明浅拷贝的时候拷贝的已存在对象的对象的属性引用。
let array = [{a: 1}, {b: 2}];let array1 = [{c: 3},{d: 4}];let array2=array.concat(array1);array1[0].c=123;console.log(array2);// [ { a: 1 }, { b: 2 }, { c: 123 }, { d: 4 } ]console.log(array1);// [ { c: 123 }, { d: 4 } ]
语法:var cloneObj = { ...obj };
var a = [ 1, 3, 5, { x: 1 } ];var b = {...a};b[0] = 2;console.log(a); // [ 1, 3, 5, { x: 1 } ];console.log(b); // [ 2, 3, 5, { x: 1 } ];// 从输出结果可以看出,浅拷贝后,数组a[0]并不会随着b[0]改变而改变// 说明a和b在栈内存中引用地址并不相同。
var a = [ 1, 3, 5, { x: 1 } ];var b = {...a};b[3].x = 2;console.log(a); // [ 1, 3, 5, { x: 2 } ];console.log(b); // [ 1, 3, 5, { x: 2 } ];// 从输出结果可以看出,浅拷贝后,数组中对象的属性会根据修改而改变// 说明浅拷贝的时候拷贝的已存在对象的对象的属性引用。
//浅拷贝实现var obj = { a:1, arr: [2,3] };var shallowObj = shallowCopy(obj);function shallowCopy(src) { var dst = {}; for (var prop in src) { if (src.hasOwnProperty(prop)) { dst[prop] = src[prop]; } } return dst;}shallowObj.arr[1] = 5;obj.arr[1] // = 5
深拷贝开辟一个新的栈,两个对象对应两个不同的地址,修改一个对象的属性,不会改变另一个对象的属性
注意:深拷贝对对象中的子对象进行递归拷贝,拷贝前后两个对象互不影响
let arr = [1, 2, {name: ' duoduo'}];let newarr = JSON.parse(JSON.stringify(arr));newarr[2].name = 'nana'; console.log(newarr); // [ 1, 2, { username: 'nana' } ]console.log(arr); // [ 1, 2, { username: 'duoduo' } ]
JSON.stringify()实现深拷贝注意点
var $ = require('jquery');var obj1 = { a: 1, b: { f: { g: 1 } }, c: [1, 2, 3]};var obj2 = $.extend(true, {}, obj1);
浅拷贝和**深拷贝区别
浅拷贝只复制一层对象的属性,而深拷贝则递归复制了所有层级