//基本数据类型赋值 var a = 10; var b = a; a++ ; console.log(a); // 11 console.log(b); // 10 //引用数据类型赋值 let a = { name: '11' } let b = a b.name = '22' console.log(a.name) // 22 console.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注意事项
undefined
和null
无法转成对象,它们不能作为object.assign
参数,但是可以作为源对象symbol
值的属性,可以被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);
浅拷贝和深拷贝****区别
浅拷贝只复制一层对象的属性,而深拷贝则递归复制了所有层级
**
如对本文有疑问, 点击进行留言回复!!
【JavaScript笔记(一)】万丈高楼平地起 - 基本概念篇
轻松解决 org.apache.taglibs.standard.tlv.JstlCoreTLV 困惑
vert实践五——Json?Protocol Buffer?FlatBuffers?
[基于tensorflow的人脸检测] 基于神经网络的人脸检测8——验证训练好的神经网络
网友评论