浅拷贝与深拷贝
原始类型的复制
将 message
复制到 phrase
,这样message
和phrase
就是两个独立的变量,互不干扰。原始类型是存在内存的栈里。
| let message = "Hello!"; let phrase = message;
|
对象的复制引用
看一段代码,显然a
和b
都指向同一块内存地址
| let a = {}; let b = a;
alert( a == b ); alert( a === b );
|
对象的浅拷贝
遍历一维对象(我自己取的名字)的所有属性,搬运到新建的空对象上,但是如果对象里面嵌套了对象,这一招就不管用了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| let user = { name: "John", age: 30 };
let clone = {};
for (let key in user) { clone[key] = user[key]; }
clone.name = "Pete";
alert( user.name );
|
javascript还提供了Object.assign
这个方法。使用方法如下:
| let user = { name: "John" };
let permissions1 = { canView: true }; let permissions2 = { canEdit: true };
Object.assign(user, permissions1, permissions2);
|
对象的深拷贝
可以使用递归的方式实现深层拷贝
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| let user = { name: "John", sizes: { height: 182, width: 50 } }; function deepClone(obj){ let newObj={}; for(let key in obj){ if(typeof obj[key]==='Object'&& obj[key]!==null){ newObj[key]=deepClone(obj[key]); }else{ newObj[key]=obj[key]; } } return newObj; } deepClone(user);
|
很蓝很蓝啦~~
还可以使用loadsh库的_.cloneDeep(obj)