賦值
基本資料型別=> 賦值,賦值之後,兩個變數互不影響
eg: var a=1 b=a console.log(b) // 1 a=2 console.log(b) //1
引用資料型別=> 賦址,僅改變引用的指標,指向同乙個物件,所以相互之間有影響
eg: var obj= var obj1=obj console.log(obj1) // obj.a=3 obj.b=4 console.log(obj1) //
重新在堆中建立記憶體,拷貝前後物件的基本資料型別互不影響,只拷貝一層,不能對物件的子物件進行拷貝
典型的淺拷貝方法 object.assign()
eg:var obj= obj1=new object() object.assign(obj1, obj) obj.a=3 console.log(obj1) // obj1.a=4 console.log(obj) //
淺拷貝方法
var obj=}
var obj1=obj
function copyobj(obj)
for(var key in obj)
} return qkb;
}var obj2= copyobj(obj)
obj.a="haha"
obj.b.c="wo"
console.log(obj1) // }
console.log(obj2) //}
ob1只是將指標改變,引用的仍然是同乙個物件,而淺拷貝得到的obj2建立了新物件,但是,原物件obj的子物件,則不會對這個子物件淺拷貝,而只是複製其物件的變數位址
=>對物件中的子物件進行遞迴拷貝,拷貝前後的兩個物件,互不影響
1>深拷貝方法 json.parse(json.stringify(obj))
var obj = }
var copy = json.parse(json.stringify(obj))
obj.a.b = 2
console.log(obj) // }
console.log(copy) // }
但是 json.parse()、json.stringify也存在乙個問題,json.parse()和j son.stringify()能正確處理的物件只有number、string、array等能夠被 json 表示的資料結構,因此函式這種不能被 json 表示的型別將不能被正確處理。
var target =
};var copy = json.parse(json.stringify(target));
console.log(copy); //
console.log(json.stringify(target)); // ""
2> 遍歷實現屬性複製
function deepcopy (source)
for (var key in source) else }}
} else
return target
}var obj1 = }
var cpobj1 = deepcopy(obj1)
obj1.a.b = 2
console.log(cpobj1) // }
var obj2 = [[1]]
var cpobj2 = deepcopy(obj2)
obj2[0][0] = 2
console.log(cpobj2) // [[1]]
js 資料型別、賦值、深拷貝和淺拷貝 淺拷貝 深拷貝
copy mutablecopy copy 不管是可變的,還是不可變的,結果都是不可變的 mutablecopy 不管是不可變的,還是可變的,結果都是可變的 nsmutablestring str nsmutablestring stringwithformat a nsarray arr1 str...
深拷貝 淺拷貝
c 中物件的複製就如同 轉殖 用乙個已有的物件快速地複製出多個完全相同的物件。一般而言,以下三種情況都會使用到物件的複製 1 建立乙個新物件,並用另乙個同類的已有物件對新物件進行初始化,例如 cpp view plain copy class rect rect rect1 rect rect2 r...
淺拷貝 深拷貝
retain是建立乙個指標,引用物件計數加1。copy屬性表示兩個物件內容相同,新的物件retain為1 與舊有物件的引用計數無關,舊有物件沒有變化。copy減少物件對上下文的依賴。retain屬性表示兩個物件位址相同 建立乙個指標,指標拷貝 內容當然相同,這個物件的retain值 1也就是說,re...