slice(0)和深拷貝區別


slice(0)和深拷貝有什么區別呢?

舉個栗子:

var obj = [
    {
		name:'melin1',
		job:'111'
	},
	{
		name:'melin2',
		job:'222'
	},
	{
		name:'melin3',
		job:'333'
	}
];
var copy = obj.slice(0);
copy[1].name = 'tom';
console.log(obj[1].name); //tom
console.log(copy[1].name); //tom

結果是obj[1].name和copy[1].name都被修改了。slice可看作淺拷貝,因為如果obj有引用類型的元素,slice僅僅是復制了元素的地址。

  • (1)拷貝是指得到被拷貝對象的副本,副本的修改不會影響到原對象;

  • (2)js的傳參是按值傳遞,但是對於引用類型,傳遞的值是原對象在內存中的地址,所以拷貝僅僅是獲取了原對象的引用;

  • (3)在 (2) 的基礎上,對拷貝進行修改,原對象也會被修改;

  • (4)要想避免(3)的情況出現,就不能僅僅拷貝地址,而是要將原對象的屬性樹遍歷復制到拷貝上,這樣拷貝和原對象就是完全獨立的了;

  • (5)(4)的情況叫深拷貝,與之相對, (2) 的情況叫淺拷貝;

  • (6)如果obj所有值都是非引用類型,那么obj.slice(0)與深淺拷貝沒有差別;

  • (7)如果obj有引用類型的元素的話,obj.slice(0)僅僅是復制了元素的地址,,obj.slice(0)可看作淺拷貝。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM