摘要:返回一個(gè)布爾值,表示該值是否為的成員。清除所有成員,沒有返回值。上面代碼中,方法返回的遍歷器,同時(shí)包括鍵名和鍵值,所以每次輸出一個(gè)數(shù)組,它的兩個(gè)成員完全相等。因此,適合臨時(shí)存放一組對(duì)象,以及存放跟對(duì)象綁定的信息。
Js大部分歷史時(shí)期都只存在一種集合類型,也就是數(shù)組類型。數(shù)組在 JS 中的使用正如其他語(yǔ)言的數(shù)組一樣,但缺少更多類型的集合導(dǎo)致數(shù)組也經(jīng)常被當(dāng)作隊(duì)列與棧來(lái)使用。數(shù)組只使用了數(shù)值型的索引,而如果非數(shù)值型的索引是必要的,開發(fā)者便會(huì)使用非數(shù)組的對(duì)象。這種技巧引出了非數(shù)組對(duì)象的定制實(shí)現(xiàn),即 Set 與 Map 。
Set: Set概述Set對(duì)象是值的集合,你可以按照插入的順序迭代它的元素。 Set中的元素只會(huì)出現(xiàn)一次,即 Set 中的元素是唯一的。
? Set結(jié)構(gòu)類似于數(shù)組,但是沒有重復(fù)結(jié)構(gòu)Set的構(gòu)造:
? Set會(huì)自動(dòng)移除重復(fù)的值,因此可以用來(lái)過(guò)濾數(shù)組中的重復(fù)結(jié)構(gòu)
? Set內(nèi)的對(duì)象是強(qiáng)引用
a) let set = new Set([1, 2, 3, 4]);
Set 構(gòu)造器實(shí)際上可以接收任意可迭代對(duì)象作為參數(shù)。能使用數(shù)組是因?yàn)樗鼈兡J(rèn)就是可迭代的,Set與Map也是一樣,Set構(gòu)造器會(huì)使用迭代器來(lái)提取參數(shù)中的值
b) let set = new Set(); set.add(1); set.add(2); set.add(2); //如果add對(duì)相同的值進(jìn)行了多次調(diào)用,那么那么在第一次之后的調(diào)用實(shí)際上會(huì)被忽略 set.add(3); set.add("3");
Set 不會(huì)使用強(qiáng)制類型轉(zhuǎn)換來(lái)判斷值是否重復(fù)。這意味著 Set 可以同時(shí)包含數(shù)值 3 與 字符串 "3" ,將它們都作為相對(duì)獨(dú)立的項(xiàng).
Set判斷是否重復(fù)使用了Object.is() 方法,唯一的例外是 +0 與 -0 在 Set 中被判斷為是相等的
c) 還可以向Set添加多個(gè)值相同的對(duì)象,他們不會(huì)被合并為同一項(xiàng)。
let set = new Set(); let key1 = {}; let key2 = {}; set.add(key1); set.add(key2);Set的屬性及方法: 1、屬性
Set.prototype.constructor:構(gòu)造函數(shù),默認(rèn)就是Set函數(shù)。 Set.prototype.size:返回Set實(shí)例的成員總數(shù)。2、方法
Set的方法分為兩類:操作方法 和 遍歷方法
2.1、操作方法:?add(value):添加某個(gè)值,返回 Set 結(jié)構(gòu)本身。 因?yàn)榉祷豷et本身,所以可以寫成: set.add(1).add(2).add(3) ?delete(value):刪除某個(gè)值,返回一個(gè)布爾值,表示刪除是否成功。 set.delete(2) ; // true ?has(value):返回一個(gè)布爾值,表示該值是否為Set的成員。 set.has(2) ; // false ?clear():清除所有成員,沒有返回值。2.2、遍歷方法:
es5給數(shù)組添加了forEach()方法,使得更容易處理數(shù)組中的每一項(xiàng),沒有返回值
對(duì)于數(shù)組來(lái)說(shuō)forEach的三個(gè)參數(shù):
arr[].forEach(function(value,index,array){//do})
value數(shù)組中的當(dāng)前項(xiàng), index當(dāng)前項(xiàng)的索引, array原始數(shù)組
但是對(duì)于Set來(lái)說(shuō):
let set2 = new Set([{"a":1}, {"b":2}]); set2.forEach(function(value, key, ownerSet) { console.log(ownerSet === set2); console.log(value === key); }); key 與 value 總是相同的,同時(shí) ownerSet 也始終等于 set 。此代碼輸出: true true true true
如果想在回調(diào)函數(shù)中使用當(dāng)前的this,還可以在forEach中傳入this作為第二個(gè)參數(shù)
let set = new Set([1, 2]); let processor = { output(value) { console.log(value); }, process(dataSet) { dataSet.forEach(function(value) { this.output(value); }, this); } }; processor.process(set);
本例中,在processor.process方法中的set調(diào)用了forEach方法,并傳遞了this作為第二個(gè)參數(shù),這樣便能正確的調(diào)用到this.output()方法
或者也可以使用箭頭函數(shù)來(lái)達(dá)到相同的效果,無(wú)需傳入this,只需將上邊的process改寫成:
process(dataSet) { dataSet.forEach((value) => this.output(value)); }
keys():返回鍵名的遍歷器
values():返回鍵值的遍歷器
entries():返回鍵值對(duì)的遍歷器
keys方法、values方法、entries方法返回的都是遍歷器對(duì)象,由于Set結(jié)構(gòu)沒有鍵名,只有鍵值(或者說(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"]
上面代碼中,entries方法返回的遍歷器,同時(shí)包括鍵名和鍵值,所以每次輸出一個(gè)數(shù)組,它的兩個(gè)成員完全相等。
Set 結(jié)構(gòu)的實(shí)例默認(rèn)可遍歷,它的默認(rèn)遍歷器生成函數(shù)就是它的values方法。
Set.prototype[Symbol.iterator] === Set.prototype.values
// true
這就意味著,可以省略values方法,直接用for…of循環(huán)遍歷Set
let set = new Set(["red", "green", "blue"]); for (let x of set) { console.log(x); } // red // green // blueSet常用場(chǎng)景
Set最經(jīng)典的應(yīng)用就是數(shù)組排重:
let set = new Set([1, 2, 3, 3, 3, 4, 5]), array = [...set]; console.log(array);Set與其他數(shù)據(jù)結(jié)構(gòu)的互相轉(zhuǎn)換 1、 Set與數(shù)組的轉(zhuǎn)換 1.1、 Set轉(zhuǎn)數(shù)組
使用擴(kuò)展運(yùn)算符可以很簡(jiǎn)單的將Set轉(zhuǎn)成數(shù)組
let set = new Set([1, 2, 3, 3, 3, 4, 5]), let array = [...set]; console.log(array); // [1,2,3,4,5]
該示例很好的說(shuō)明了Set的一個(gè)重要的功能,數(shù)組排重,當(dāng)然也很好的展示了,如何從Set轉(zhuǎn)成數(shù)組的過(guò)程。
注意,這種轉(zhuǎn)變是生成了一個(gè)新的數(shù)組對(duì)象原來(lái)的Set依然存在。
如最初的構(gòu)造示例:
let set = new Set([1,4,5,6,7]);WeakSet:
由于 Set 類型存儲(chǔ)對(duì)象引用的方式,它也可以被稱為 Strong Set 。對(duì)象存儲(chǔ)在 Set 的一個(gè)實(shí)例中時(shí),實(shí)際上相當(dāng)于把對(duì)象存儲(chǔ)在變量中。只要對(duì)于 Set 實(shí)例的引用仍然存在,所存儲(chǔ)的對(duì)象就無(wú)法被垃圾回收機(jī)制回收,從而無(wú)法釋放內(nèi)存。
當(dāng) JS 代碼在網(wǎng)頁(yè)中運(yùn)行,同時(shí)你想保持與 DOM 元素的聯(lián)系,在該元素可能被其他腳本移除的情況下,你應(yīng)當(dāng)不希望自己的代碼保留對(duì)該 DOM 元素的最后一個(gè)引用(這種情況被稱為內(nèi)存泄漏)
為了緩解這個(gè)問(wèn)題, ES6 也包含了 Weak Set ,該類型只允許存儲(chǔ)對(duì)象弱引用,而不能存儲(chǔ)基本類型的值。對(duì)象的弱引用在它自己成為該對(duì)象的唯一引用時(shí),不會(huì)阻止垃圾回收。
WeakSet 里面的引用,都不計(jì)入垃圾回收機(jī)制,所以就不存在這個(gè)問(wèn)題。因此,WeakSet 適合臨時(shí)存放一組對(duì)象,以及存放跟對(duì)象綁定的信息。只要這些對(duì)象在外部消失,它在 WeakSet 里面的引用就會(huì)自動(dòng)消失
Weak Set 使用 WeakSet 構(gòu)造器來(lái)創(chuàng)建:
let set = new WeakSet(), key = {}; // 將對(duì)象加入 set set.add(key); console.log(set.has(key)); // true set.delete(key); console.log(set.has(key)); // falseWeakSet的屬性和方法:
基于WeakSet的弱引用特性,且里邊的對(duì)象有可能隨時(shí)消失的特性,es6規(guī)定WeakSet不可遍歷,且沒有size屬性,WeakSet只有以下三個(gè)方法:
WeakSet.prototype.add(value):向 WeakSet 實(shí)例添加一個(gè)新成員。
WeakSet.prototype.delete(value):清除 WeakSet 實(shí)例的指定成員。
WeakSet.prototype.has(value):返回一個(gè)布爾值,表示某個(gè)值是否在 WeakSet 實(shí)例之中。
對(duì)于 WeakSet 的實(shí)例,若調(diào)用add()方法時(shí)傳入了非對(duì)象的參數(shù),就會(huì)拋出錯(cuò)誤(has()或delete()則會(huì)在傳入了非對(duì)象的參數(shù)時(shí)返回false);
Weak Set 不可迭代,因此不能被用在 for-of 循環(huán)中;
Weak Set 無(wú)法暴露出任何迭代器; (例如 keys()與values() 方法,因此沒有任何編程手段可用于判斷 Weak Set 的內(nèi)容);
Weak Set 沒有 forEach() 方法;
Weak Set 沒有 size 屬性。
WeakSet之所以不可遍歷是由于 WeakSet 內(nèi)部有多少個(gè)成員,取決于垃圾回收機(jī)制有沒有運(yùn)行,運(yùn)行前后很可能成員個(gè)數(shù)是不一樣的,而垃圾回收機(jī)制何時(shí)運(yùn)行是不可預(yù)測(cè)的,因此 ES6 規(guī)定 WeakSet 不可遍歷。
WeakSet常用場(chǎng)景
Weak Set 看起來(lái)功能有限,而這對(duì)于正確管理內(nèi)存而言是必要的。一般來(lái)說(shuō),若只想追蹤對(duì)象的引用,應(yīng)當(dāng)使用 Weak Set 而不是正規(guī) Set
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/96832.html
摘要:這幾意味著,在初始化和調(diào)用的時(shí)候,都只能傳入對(duì)象類型的元素。如果給方法傳入非對(duì)象類型,會(huì)拋出錯(cuò)誤。 在我們進(jìn)入在WeakSet的使用之前,我們先來(lái)看一個(gè)用Set來(lái)存儲(chǔ)對(duì)象引用的例子: let set = new Set(); let key = {}; set.add(key); key = null; console.log(set.size); // 1 console.log([...
摘要:一概述集合是引入的新的內(nèi)置對(duì)象類型,其特點(diǎn)同數(shù)學(xué)意義的集合,即集合內(nèi)所有元素不重復(fù)元素唯一。數(shù)組集合對(duì)比數(shù)組和集合,數(shù)組可以加入重復(fù)數(shù)據(jù),而集合的所有元素是唯一的不允許重復(fù)。因此,適合臨時(shí)存放一組對(duì)象,以及存放跟對(duì)象綁定的信息。 本文同步帶你入門 帶你入門 JavaScript ES6 (五) 集合,轉(zhuǎn)載請(qǐng)注明出處。 前面我們學(xué)習(xí)了: for of 變量和擴(kuò)展語(yǔ)法 塊作用域變量和解構(gòu)...
摘要:返回一個(gè)布爾值,表示該值是否為的成員。返回鍵名的遍歷器返回鍵值的遍歷器返回鍵值對(duì)的遍歷器使用回調(diào)函數(shù)遍歷每個(gè)成員需要特別指出的是,的遍歷順序就是插入順序。該數(shù)組的所有成員,都會(huì)自動(dòng)成為實(shí)例對(duì)象的成員。這意味著,數(shù)組的成員只能是對(duì)象。 1.Set ES6 提供了新的數(shù)據(jù)結(jié)構(gòu) Set。它類似于數(shù)組,但是成員的值都是唯一的,沒有重復(fù)的值。Set 本身是一個(gè)構(gòu)造函數(shù),用來(lái)生成 Set 數(shù)據(jù)結(jié)構(gòu)...
摘要:對(duì)象允許你存儲(chǔ)任何類型的唯一值,無(wú)論是原始值或者是對(duì)象引用。不能重復(fù)獲取的值方法用來(lái)向一個(gè)對(duì)象的末尾添加一個(gè)指定的值。 Set 對(duì)象允許你存儲(chǔ)任何類型的唯一值,無(wú)論是原始值或者是對(duì)象引用。(不能重復(fù)) const set1=new Set([1,2,3,4,5,6]); console.log(set1); //Set { 1, 2, 3, 4, 5, 6 } 獲取set的值 cons...
摘要:引入的數(shù)據(jù)結(jié)構(gòu)新加入的數(shù)據(jù)類型有這些數(shù)據(jù)結(jié)構(gòu)的支持并不廣泛,在寫這篇文章的時(shí)候。是或其他可枚舉的對(duì)象,其每個(gè)元素是的元數(shù)組。開頭的和不對(duì)持有引用,不影響。因此,他們沒有辦法對(duì)自身的進(jìn)行直接的枚舉。目前新版的和支持。 原文:http://pij.robinqu.me/JavaScript_Core/ECMAScript/es6/es6_data_types.html 源代...
閱讀 2958·2023-04-25 22:16
閱讀 2125·2021-10-11 11:11
閱讀 3258·2019-08-29 13:26
閱讀 602·2019-08-29 12:32
閱讀 3422·2019-08-26 11:49
閱讀 3001·2019-08-26 10:30
閱讀 1952·2019-08-23 17:59
閱讀 1518·2019-08-23 17:57