轉殖
轉殖和我們前面所講的繼承有一些區別,轉殖是複製出來乙個一模一樣的目標物件,而轉殖又分為淺層轉殖和深層轉殖,本質就是把乙個物件的一些屬性複製成完全一樣的另乙個物件。
淺度轉殖
淺度轉殖是認為物件的的屬性,沒有物件和陣列,直接把物件的一些屬性給複製過來。
function
clone
(p,c);//當沒有傳值是,預設為乙個物件。
for(var prop in p)
}}var obj1 =
var obj2 = {};
clone(obj1,obj2)
obj1.arr.push(5)
obj1.name = "yun";
console.log(obj2);
列印的結果如下:
我們可以發現,轉殖出來的目標物件和本來的源物件之間沒有關係了。
但是,當我們有乙個屬性是引用值(陣列或者物件)的時候,按照我們這種轉殖方式,只是把這個引用值的指向賦給了新的目標物件,也就是說,我們一旦改變了源物件或者目標物件的引用值屬性,另乙個也會跟著改變,這一點就是淺層轉殖的缺點。
淺度轉殖
為了解決淺層轉殖的引用值的問題,我們又需要一種深層轉殖。
其實深層轉殖的原理也很簡單,我們只要不轉殖引用值的引用,而是吧引用值也當做乙個源物件,把裡面的值乙個乙個的轉殖進目標物件裡面,不就解決了他們二者相同指向的問題了嗎。
陣列去重
這個去重的思路是,現將陣列進行排序(sort()),排完之後,前後指定有一樣的。然後在拿乙個陣列儲存第乙個數,然後在把後面的與它前乙個數比較,如果是不相同的,那麼進把它儲存在陣列裡面,最後迴圈結束之後。再將其返回出來,這個方法最好寫在陣列的原型鏈上。
array.prototype.unique = function()}
console.timeend('第一種時間');
return arr
}
這種方式雖然比較快,但是它是優缺點的,這個方法改變原陣列的位置。如果題目要求不讓改變陣列的原位置,這種方式就不好使。
這裡特說明一下吧,sort()
這種排序的方式,不是按照大小的方式,它是按照二進位製碼進行排序的。
var arr1 = [10,2,2,2,4,9,5,3,9,4,3,7,5];
console.log(arr1.sort());//10,2, 2, 2, 3, 3, 4, 4, 5, 5, 7, 9, 9,
想要進行排序也是行的:
arr1.sort(function
(a,b))
array.prototype.unique = function
()if(!flag)}}
console.timeend('第二種時間');
return arr;
}
這種方式相對來說是比較慢的,它是經歷了兩個迴圈的,用專業術語來講,它的時間複雜度是(n^2)。這也是很常規的方式,缺點就是迴圈相對來說比較慢。但是跟第一種方式來比較的話,他不會改變原陣列的位置。
array.prototype.unique = function
(); console.time('第三種時間');
for(var i = 0;i < this.length; i++)
}console.timeend('第三種時間');
return arr;
}
最後說一種方法,es6中的一種去重的方法:
var arr = new
set(arr1);
這種方法可以直接呼叫。 es6 轉殖與函式深度轉殖
es6的.運算,可以進行一層的深度轉殖 在多層的情況下,不要用這種啊.用深度轉殖函式,或者json.parse json.stringify obj 但json方式要求不能有屬性值是函式的物件 1 const obj 6 7 const obj3 8 obj3.name obj.name 這個效果和...