js中,一般的賦值傳遞的都是物件/陣列的引用,並沒有真正的深拷貝乙個物件,如何進行物件的深拷貝呢?
var a =
;var b = a;
b.name =
'jone'
;console.
log(a.name)
//jone
上述**中,b指向a所指向的棧物件,也就是說a,b指向同乙個棧物件,這種屬於物件的淺拷貝。
var a =
;var b = object.
assign
(,a)
;console.
log(a === b)
//false
b.name =
'chris'
;console.
log(a.name)
//miya
上述**將原物件拷貝到乙個空物件中,a,b指向的是不同的棧物件,所以對b.name重新賦值不會影響到a.name,但是如果a.name是乙個物件的引用,而不是乙個字串,那麼a.nam和b.name指向的棧空間就是同乙個了,看下面的栗子:
var a =
}var b = object.
assign
(,a)
console.
log(a === b)
;//false
b.name.firstname =
"chen"
console.
log(a.name.firstname)
//chen
可以看出,object.assign只是介於物件的深轉殖和淺轉殖之間的一種拷貝。具體來說也只是淺拷貝。對於物件屬性值為引用型別時,賦值時也是對於棧物件的引用罷了,那如何真正的進行物件的深拷貝呢?
使用json.parse()和json.stringify()對物件進行深拷貝
可以看出,上述clone的方法會忽略function和undefined的字段,對date型別支援貌似也不友好。而且只能轉殖原始物件自身的值,不能轉殖它繼承的值,參考**如下:
function
person
(name)
var tang =
newperson
('miya');
var newtang =
clone
(tang)
tang.constructor === person //true
newtang.constructor === person //false
console.
log(newtang.constructor)
//ƒ object()
結論:對於純資料的json物件的深轉殖,可以使用json.parse()和json.stringify()方法,自己可以寫個相容function,undefined,繼承,date的深拷貝的方法:
var
clone
=function
(obj)
}return newobj;
}
經過驗證,上述的原型的繼承,還是function,undefined,日期,正則等都完美實現深拷貝!
這裡運用的就是建立乙個新的物件,進行原始物件自有屬性的拷貝,遇到引用型別則繼續該方法的執行,非引用型別直接賦值。
JS如何進行物件的深轉殖(深拷貝)?
js中,一般的賦值傳遞的都是物件 陣列的引用,並沒有真正的深拷貝乙個物件,如何進行物件的深拷貝呢?var a var b a b.name jone console.log a.name jone 上述 中,b指向a所指向的棧物件,也就是說a,b指向同乙個棧物件,這種屬於物件的淺拷貝。var a v...
js深轉殖深拷貝
不足之處是不能拷貝函式,但是基本夠用 const deepcopy obj json parse json stringify obj 如果涉及拷貝函式 簡單一點 function copy object for const k,v of object.entries object return o...
JS實現深拷貝 深轉殖 和淺拷貝 淺轉殖
淺拷貝 只複製物件的基本型別,對於引用型別,只是轉殖位址 包含的內嵌的物件或陣列,不再複製副本 引用型別,只是轉殖位址,那麼原物件修改,轉殖後的新物件也會跟著變化,轉殖不徹底 陣列的array.from 方法就是實現的淺拷貝 物件的object.assign 方法也是實現的淺拷貝 深拷貝 複製物件的...