有效的對象拷貝應(yīng)該是指深拷貝。

創(chuàng)新互聯(lián)主要從事成都網(wǎng)站設(shè)計、成都做網(wǎng)站、網(wǎng)頁設(shè)計、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)同安,十載網(wǎng)站建設(shè)經(jīng)驗,價格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):13518219792
淺拷貝 : 就是兩個js 對象指向同一塊內(nèi)存地址,所以當obj1 ,obj2指向obj3的時候,一旦其中一個改變,其他的便會改變!
深拷貝:就是重新復制一塊內(nèi)存,這樣就不會互相影響。
有些時候我們定義一個數(shù)組,把這個數(shù)據(jù)賦值給跟多對象數(shù)組中的一個字段,當我們改變對象數(shù)組中的該字段的時候,我們會把原來的數(shù)組也改變了,這樣就會引起其他數(shù)組對象中的對應(yīng)的字段改變,這不是我們想要的。
這個時候我們會用到深拷貝。
深拷貝的方法:
var?deepCopy?=?function(source)
{
var?result;
(source?instanceof?Array)???(result?=?[])?:?(result?=?{});
for?(var?key?in?source)?{
result[key]?=?(typeof?source[key]==='object')???deepCopy(source[key])?:?source[key];
}????
return?result;??
}
簡單來說,深拷貝主要是將另一個對象的屬性值拷貝過來之后,另一個對象的屬性值并不受到影響,因為此時它自己在堆中開辟了自己的內(nèi)存區(qū)域,不受外界干擾。
淺拷貝主要拷貝的是對象的引用值,當改變對象的值,另一個對象的值也會發(fā)生變化。
使用 js ON.stringify和 js ON.parse實現(xiàn)深拷貝:JSON.stringify把對象轉(zhuǎn)成字符串,再用JSON.parse把字符串轉(zhuǎn)成新的對象;
缺陷:它會拋棄對象的 const ructor,深拷貝之后,不管這個對象原來的構(gòu)造 函數(shù) 是什么,在深拷貝之后都會變成Object;這種方法能正確處理的對象只有 Number, String, Boolean, Array, 扁平對象,也就是說,只有可以轉(zhuǎn)成JSON格式的對象才可以這樣用,像function沒辦法轉(zhuǎn)成JSON;
遞歸拷貝實現(xiàn)深拷貝,解決循環(huán)引用問題
淺拷貝只是拷貝了引用, 數(shù)據(jù)在內(nèi)存中還是一個, 如果引用的對象發(fā)生了變化, 該變量也會同步變化.
深拷貝相當于把內(nèi)存上的數(shù)據(jù)拷貝了一份, 此時修改該變量不會影響原來的變量, 同理修改原來的變量也不會影響現(xiàn)在的變量.
淺拷貝:
const?foo?=?{?bar:?'bar',?baz:?'baz'?}
const?ref_foo?=?foo
深拷貝(最簡單的方法, 拷貝性能也不弱):
const?foo?=?{?bar:?'bar',?baz:?'baz'?}
const?ano_foo?=?JSON.parse(JSON.stringify(foo))
4.通過第三方工具實現(xiàn)深拷貝
lodash.cloneDeep
數(shù)組深拷貝
1. concat(arr1, arr2,....)
2. slice(idx1, idx2)
參數(shù)可以省略
1)沒有參數(shù)是拷貝數(shù)組
2)只有一個參數(shù)是從該位置起到結(jié)束拷貝數(shù)組元素
3)兩個參數(shù),拷貝從起始位置到結(jié)束位置的元素(不包含結(jié)束位置的元素:含頭不含尾)
注意:當數(shù)組中的元素均為一維是深拷貝
? ? ? 數(shù)組中元素一維以上是值的引用
//?淺拷貝
function?copy(o)?{
var?result?=?{};
for(var?i?in?o)
result[i]?=?o[i];
return?result;
}
//?深拷貝
function?deepCopy(o)?{
var?result?=?{};
for(var?i?in?o)?
result[i]?=?(typeof?o[i])?===?'object'???deepCopy(o[i])?:?o[i];
return?result;
}
這就是淺拷貝,大兄弟
標題名稱:javascript拷貝,js函數(shù)拷貝
鏈接分享:http://chinadenli.net/article47/dsepphj.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供Google、云服務(wù)器、關(guān)鍵詞優(yōu)化、手機網(wǎng)站建設(shè)、移動網(wǎng)站建設(shè)、全網(wǎng)營銷推廣
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)