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

資訊專欄INFORMATION COLUMN

前端面試總結(jié)--數(shù)據(jù)結(jié)構(gòu)與算法五

xuexiangjys / 1049人閱讀

摘要:結(jié)構(gòu)的實(shí)例的方法,用于對(duì)每個(gè)成員執(zhí)行某種操作,沒(méi)有返回值。參考和數(shù)據(jù)結(jié)構(gòu)推薦一個(gè)找組件的輪子工廠前端面試總結(jié)數(shù)據(jù)結(jié)構(gòu)與算法一前端面試總結(jié)數(shù)據(jù)結(jié)構(gòu)與算法二前端面試總結(jié)數(shù)據(jù)結(jié)構(gòu)與算法三前端面試總結(jié)數(shù)據(jù)結(jié)構(gòu)與算法四

集合

集合是由一組無(wú)序且唯一的項(xiàng)組成。這個(gè)數(shù)據(jù)結(jié)構(gòu)使用了與有限集合相同的數(shù)學(xué)概念。

創(chuàng)建一個(gè)集合
function Set(){
    var items = {};
}

集合的方法

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

完整的集合代碼
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);
   };
   
}
集合操作

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

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的標(biāo)準(zhǔn)中實(shí)現(xiàn)了Set的數(shù)據(jù)結(jié)構(gòu),它可以這樣被使用。

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 實(shí)例的屬性和方法

Set 結(jié)構(gòu)的實(shí)例有以下屬性。

Set.prototype.constructor:構(gòu)造函數(shù),默認(rèn)就是Set函數(shù)。

Set.prototype.size:返回Set實(shí)例的成員總數(shù)

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

add(value):添加某個(gè)值,返回Set結(jié)構(gòu)本身。

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

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

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

*去除數(shù)值重復(fù)元素的方法

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

*Array.from方法可以將 Set 結(jié)構(gòu)轉(zhuǎn)為數(shù)組。

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

遍歷操作

Set 結(jié)構(gòu)的實(shí)例有四個(gè)遍歷方法,可以用于遍歷成員。

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

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

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

forEach():使用回調(diào)函數(shù)遍歷每個(gè)成員

Set的遍歷順序就是插入順序。這個(gè)特性有時(shí)非常有用,比如使用Set保存一個(gè)回調(diào)函數(shù)列表,調(diào)用時(shí)就能保證按照添加順序調(diào)用。
keys方法、values方法、entries方法返回的都是遍歷器對(duì)象。由于 Set 結(jié)構(gòu)沒(méi)有鍵名,只有鍵值(或者說(shuō)鍵名和鍵值是同一個(gè)值),所以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結(jié)構(gòu)的實(shí)例的forEach方法,用于對(duì)每個(gè)成員執(zhí)行某種操作,沒(méi)有返回值。

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

實(shí)現(xiàn)并集(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 結(jié)構(gòu)與 Set 類似,也是不重復(fù)的值的集合。但是,它與 Set 有兩個(gè)區(qū)別。

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

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 添加一個(gè)數(shù)值和Symbol值,結(jié)果報(bào)錯(cuò),因?yàn)?WeakSet 只能放置對(duì)象。

其次,WeakSet 中的對(duì)象都是弱引用,即垃圾回收機(jī)制不考慮 WeakSet 對(duì)該對(duì)象的引用,也就是說(shuō),如果其他對(duì)象都不再引用該對(duì)象,那么垃圾回收機(jī)制會(huì)自動(dòng)回收該對(duì)象所占用的內(nèi)存,不考慮該對(duì)象還存在于 WeakSet 之中。

這是因?yàn)槔厥諜C(jī)制依賴引用計(jì)數(shù),如果一個(gè)值的引用次數(shù)不為0,垃圾回收機(jī)制就不會(huì)釋放這塊內(nèi)存。結(jié)束使用該值之后,有時(shí)會(huì)忘記取消引用,導(dǎo)致內(nèi)存無(wú)法釋放,進(jìn)而可能會(huì)引發(fā)內(nèi)存泄漏。WeakSet 里面的引用,都不計(jì)入垃圾回收機(jī)制,所以就不存在這個(gè)問(wèn)題。因此,WeakSet 適合臨時(shí)存放一組對(duì)象,以及存放跟對(duì)象綁定的信息。只要這些對(duì)象在外部消失,它在 WeakSet 里面的引用就會(huì)自動(dòng)消失。

由于上面這個(gè)特點(diǎn),WeakSet 的成員是不適合引用的,因?yàn)樗鼤?huì)隨時(shí)消失。另外,由于 WeakSet 內(nèi)部有多少個(gè)成員,取決于垃圾回收機(jī)制有沒(méi)有運(yùn)行,運(yùn)行前后很可能成員個(gè)數(shù)是不一樣的,而垃圾回收機(jī)制何時(shí)運(yùn)行是不可預(yù)測(cè)的,因此 ES6 規(guī)定 WeakSet 不可遍歷。

WeakSet的應(yīng)用

WeakSet 結(jié)構(gòu)有以下三個(gè)方法。

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

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

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

 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沒(méi)有size屬性,沒(méi)有辦法遍歷它的成員。

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

// TypeError: undefined is not a function

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

WeakSet 不能遍歷,是因?yàn)槌蓡T都是弱引用,隨時(shí)可能消失,遍歷機(jī)制無(wú)法保證成員的存在,很可能剛剛遍歷結(jié)束,成員就取不到了。WeakSet 的一個(gè)用處,是儲(chǔ)存 DOM 節(jié)點(diǎn),而不用擔(dān)心這些節(jié)點(diǎn)從文檔移除時(shí),會(huì)引發(fā)內(nèi)存泄漏。

參考:

Learning Javascript Data Structures and Algorithms

Set和Map數(shù)據(jù)結(jié)構(gòu)

推薦一個(gè)找vue,angular組件的輪子工廠

前端面試總結(jié)--數(shù)據(jù)結(jié)構(gòu)與算法一
前端面試總結(jié)--數(shù)據(jù)結(jié)構(gòu)與算法二
前端面試總結(jié)--數(shù)據(jù)結(jié)構(gòu)與算法三
前端面試總結(jié)--數(shù)據(jù)結(jié)構(gòu)與算法四

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/88522.html

相關(guān)文章

  • 我的阿里之路+Java面經(jīng)考點(diǎn)

    摘要:我的是忙碌的一年,從年初備戰(zhàn)實(shí)習(xí)春招,年三十都在死磕源碼,三月份經(jīng)歷了阿里五次面試,四月順利收到實(shí)習(xí)。因?yàn)槲倚睦砗芮宄业哪繕?biāo)是阿里。所以在收到阿里之后的那晚,我重新規(guī)劃了接下來(lái)的學(xué)習(xí)計(jì)劃,將我的短期目標(biāo)更新成拿下阿里轉(zhuǎn)正。 我的2017是忙碌的一年,從年初備戰(zhàn)實(shí)習(xí)春招,年三十都在死磕JDK源碼,三月份經(jīng)歷了阿里五次面試,四月順利收到實(shí)習(xí)offer。然后五月懷著忐忑的心情開始了螞蟻金...

    姘擱『 評(píng)論0 收藏0
  • 深入理解js

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

    caikeal 評(píng)論0 收藏0
  • CSS技巧

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

    DangoSky 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

xuexiangjys

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<