JSON對象中的parse和stringify結合使用,常常被用來實現深拷貝一個對象,下面的代碼實現了對對象obj的深拷貝:
var obj = {name:"obj"};
var objCopy = JSON.parse(JSON.stringify(obj)); // {name: "obj"}
深拷貝的一個作用就是,修改obj的name屬性,不會影響objCopy的name屬性。
但是這個方法不是萬能的,它仍然有一定的局限性
- 如果被拷貝的對象中有function,則拷貝之后的對象就會丟失這個function,比如
var obj = {
func:function(){}
};
var objCopy = JSON.parse(JSON.stringify(obj)); // 最終得到 {}
- 如果被拷貝的對象中某個屬性的值為undefined,則拷貝之后該屬性會丟失,比如
var obj = {
name:undefined
};
var objCopy = JSON.parse(JSON.stringify(obj)); // 最終得到 {}
- 如果被拷貝的對象中有正則表達式,則拷貝之后的對象正則表達式會變成Object,比如
var obj = {
reg:/abc/
};
var objCopy = JSON.parse(JSON.stringify(obj)); // 最終得到 {reg:{}}
為了讓代碼更加穩健,建議使用第三方庫lodash中的cloneDeep方法