国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

前端面試總結--數據結構與算法五

xuexiangjys / 1052人閱讀

摘要:結構的實例的方法,用于對每個成員執行某種操作,沒有返回值。參考和數據結構推薦一個找組件的輪子工廠前端面試總結數據結構與算法一前端面試總結數據結構與算法二前端面試總結數據結構與算法三前端面試總結數據結構與算法四

集合

集合是由一組無序且唯一的項組成。這個數據結構使用了與有限集合相同的數學概念。

創建一個集合
function Set(){
    var items = {};
}

集合的方法

add(value) -- 向集合添加一個新的項
remove(value) -- 從集合移除一個值
has(value) -- 如果值在集合中,返回true,否則返回false
clear() -- 移除集合中的所有項
size() -- 返回集合所包含元素的數量
values() -- 返回一個包含集合中所有值的數值

完整的集合代碼
function Set(){
   var items = {};
   
   this.has = function(value){
       return items.hasOwnProperty(value);
   };
   
   this.add = function(value) {
       if(!this.has(value)){
           items[value] = value;
           return true; 
       }
       return false;
   };
   
   this.remove = function(value) {
       if(this.has(value)){
           delete items[value];
           return true;
       }
       return false;
   };
   
   this.clear = function() {
       items = {};
   };
   
   this.size = function () {
       return Object.keys(items).length;
   };
   
   this.values = function(){
       return Object.keys(items);
   };
   
}
集合操作

并集--對于給定的兩個集合,返回一個包含兩個集合中所有元素的新集合。

this.union = function(otherSet) {
    var unionSet = new Set();
    
    var values = this.values();
    for(var i=0;i

交集 -- 集合A和B的交集是元素存在于A中,其存在于B中。

this.intersection = function(otherSet) {
    var intersectionSet = new Set();
    
    var values = this.values();
    for(var i=0;i

差集 -- 集合A和B的差集,是元素存在于A中,且元素不存在于B中。

this.difference = function(otherSet){
    var differenceSet = new Set();
    var values = this.values();
    for(var i=0; i
ES6中的Set & WeakSet

ES6的標準中實現了Set的數據結構,它可以這樣被使用。

const s = new Set();

[2, 3, 5, 4, 5, 2, 2].forEach(x => s.add(x));

for (let i of s) {
  console.log(i);
}
// 2 3 5 4
Set 實例的屬性和方法

Set 結構的實例有以下屬性。

Set.prototype.constructor:構造函數,默認就是Set函數。

Set.prototype.size:返回Set實例的成員總數

Set 實例的方法分為兩大類:操作方法(用于操作數據)和遍歷方法(用于遍歷成員)。下面先介紹四個操作方法。

add(value):添加某個值,返回Set結構本身。

delete(value):刪除某個值,返回一個布爾值,表示刪除是否成功。

has(value):返回一個布爾值,表示該值是否為Set的成員。

clear():清除所有成員,沒有返回值。

*去除數值重復元素的方法

// 去除數組的重復成員
[...new Set(array)]

*Array.from方法可以將 Set 結構轉為數組。

const items = new Set([1, 2, 3, 4, 5]);
const array = Array.from(items);

遍歷操作

Set 結構的實例有四個遍歷方法,可以用于遍歷成員。

keys():返回鍵名的遍歷器

values():返回鍵值的遍歷器

entries():返回鍵值對的遍歷器

forEach():使用回調函數遍歷每個成員

Set的遍歷順序就是插入順序。這個特性有時非常有用,比如使用Set保存一個回調函數列表,調用時就能保證按照添加順序調用。
keys方法、values方法、entries方法返回的都是遍歷器對象。由于 Set 結構沒有鍵名,只有鍵值(或者說鍵名和鍵值是同一個值),所以keys方法和values方法的行為完全一致。

let set = new Set(["red", "green", "blue"]);

for (let item of set.keys()) {
  console.log(item);
}
// red
// green
// blue

for (let item of set.values()) {
  console.log(item);
}
// red
// green
// blue

for (let item of set.entries()) {
  console.log(item);
}
// ["red", "red"]
// ["green", "green"]
// ["blue", "blue"]

Set結構的實例的forEach方法,用于對每個成員執行某種操作,沒有返回值。

 let set = new Set([1, 2, 3]);
set.forEach((value, key) => console.log(value * 2) )
// 2
// 4
// 6

實現并集(Union)、交集(Intersect)和差集(Difference)

let a = new Set([1, 2, 3]);
let b = new Set([4, 3, 2]);

// 并集
let union = new Set([...a, ...b]);
// Set {1, 2, 3, 4}

// 交集
let intersect = new Set([...a].filter(x => b.has(x)));
// set {2, 3}

// 差集
let difference = new Set([...a].filter(x => !b.has(x)));
// Set {1}  
WeakSet

WeakSet 結構與 Set 類似,也是不重復的值的集合。但是,它與 Set 有兩個區別。

首先,WeakSet 的成員只能是對象,而不能是其他類型的值。

const ws = new WeakSet();
ws.add(1)
// TypeError: Invalid value used in weak set
ws.add(Symbol())
// TypeError: invalid value used in weak set

上面代碼試圖向 WeakSet 添加一個數值和Symbol值,結果報錯,因為 WeakSet 只能放置對象。

其次,WeakSet 中的對象都是弱引用,即垃圾回收機制不考慮 WeakSet 對該對象的引用,也就是說,如果其他對象都不再引用該對象,那么垃圾回收機制會自動回收該對象所占用的內存,不考慮該對象還存在于 WeakSet 之中。

這是因為垃圾回收機制依賴引用計數,如果一個值的引用次數不為0,垃圾回收機制就不會釋放這塊內存。結束使用該值之后,有時會忘記取消引用,導致內存無法釋放,進而可能會引發內存泄漏。WeakSet 里面的引用,都不計入垃圾回收機制,所以就不存在這個問題。因此,WeakSet 適合臨時存放一組對象,以及存放跟對象綁定的信息。只要這些對象在外部消失,它在 WeakSet 里面的引用就會自動消失。

由于上面這個特點,WeakSet 的成員是不適合引用的,因為它會隨時消失。另外,由于 WeakSet 內部有多少個成員,取決于垃圾回收機制有沒有運行,運行前后很可能成員個數是不一樣的,而垃圾回收機制何時運行是不可預測的,因此 ES6 規定 WeakSet 不可遍歷。

WeakSet的應用

WeakSet 結構有以下三個方法。

WeakSet.prototype.add(value):向 WeakSet 實例添加一個新成員。

WeakSet.prototype.delete(value):清除 WeakSet 實例的指定成員。

WeakSet.prototype.has(value):返回一個布爾值,表示某個值是否在WeakSet 實例之中。

 const ws = new WeakSet();
    const obj = {};
    const foo = {};
    
    ws.add(window);
    ws.add(obj);
    
    ws.has(window); // true
    ws.has(foo);    // false
    
    ws.delete(window);
    ws.has(window);    // false

WeakSet沒有size屬性,沒有辦法遍歷它的成員。

    ws.size // undefined
    ws.forEach // undefined
    
    ws.forEach(function(item){ console.log("WeakSet has " + item)})

// TypeError: undefined is not a function

上面代碼試圖獲取size和forEach屬性,結果都不能成功。

WeakSet 不能遍歷,是因為成員都是弱引用,隨時可能消失,遍歷機制無法保證成員的存在,很可能剛剛遍歷結束,成員就取不到了。WeakSet 的一個用處,是儲存 DOM 節點,而不用擔心這些節點從文檔移除時,會引發內存泄漏。

參考:

Learning Javascript Data Structures and Algorithms

Set和Map數據結構

推薦一個找vue,angular組件的輪子工廠

前端面試總結--數據結構與算法一
前端面試總結--數據結構與算法二
前端面試總結--數據結構與算法三
前端面試總結--數據結構與算法四

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/88522.html

相關文章

  • 我的阿里之路+Java面經考點

    摘要:我的是忙碌的一年,從年初備戰實習春招,年三十都在死磕源碼,三月份經歷了阿里五次面試,四月順利收到實習。因為我心理很清楚,我的目標是阿里。所以在收到阿里之后的那晚,我重新規劃了接下來的學習計劃,將我的短期目標更新成拿下阿里轉正。 我的2017是忙碌的一年,從年初備戰實習春招,年三十都在死磕JDK源碼,三月份經歷了阿里五次面試,四月順利收到實習offer。然后五月懷著忐忑的心情開始了螞蟻金...

    姘擱『 評論0 收藏0
  • 深入理解js

    摘要:詳解十大常用設計模式力薦深度好文深入理解大設計模式收集各種疑難雜癥的問題集錦關于,工作和學習過程中遇到過許多問題,也解答過許多別人的問題。介紹了的內存管理。 延遲加載 (Lazyload) 三種實現方式 延遲加載也稱為惰性加載,即在長網頁中延遲加載圖像。用戶滾動到它們之前,視口外的圖像不會加載。本文詳細介紹了三種延遲加載的實現方式。 詳解 Javascript十大常用設計模式 力薦~ ...

    caikeal 評論0 收藏0
  • CSS技巧

    摘要:技巧使你的更加專業這是上關于技巧的一篇譯文,另外你也可以在本項目看到原文。列舉了一些很實用的技巧,比如給空內容的標簽添加內容,逗號分隔列表等等。排序算法看源碼,把它背下來吧排序算法的封裝。主要幫助初學者更好的掌握排序算法的實現。 成為專業程序員路上用到的各種優秀資料、神器及框架 成為一名專業程序員的道路上,需要堅持練習、學習與積累,技術方面既要有一定的廣度,更要有自己的深度。 Java...

    DangoSky 評論0 收藏0

發表評論

0條評論

xuexiangjys

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<