ES6中如何使用Set和WeakSet

2022-10-07 08:03:07 字數 3727 閱讀 7786

es6中提供了兩新資料結構-set和weakset。set是類似於陣列,但是成員變數的值都是唯一的,沒有重複的值。weakset也是不重複的值的集合,但是只能用來存放物件。

一、set使用

(1)set本身提供了乙個建構函式,用來生成set資料結構。

var s = new set();

[2,2,2,5,8,16,2,1].map(x => s.add(x))

for(i of s)

//2,5,8,16,1

(2)set()函式可以接受乙個陣列,作為構造引數,用於做初始化。

var s = new set([1,2,3,4,2,4,3]);

[...s]

//[1,2,3,4]

注意:向set中加入值的時候不會發生型別轉換,所以5和」5」是兩個不同的值,set內部判斷兩個值是否相等,使用的是 ===,這就意味著這兩個物件總是不相等。唯一列外的是nan本身(精確相等運算子認為nan不等於自身)

let set = new set();

set.add({})

set.size//1

set.add({})

set.size//2

則,上面的**表示,由於這兩個空物件不是精確相等,所以是兩個不同的值。

(3)set的方法和屬性

(3.1)set的屬性

set.prototype.size:返回set例項的成員數量。

set.prototype.constructor:預設的構造set函式。

(3.2)set的操作啊函式

add(value):新增某個值,返回set結構本身。

delete(value):刪除某個值,返回乙個布林值,表示刪除成功。

has(value):返回乙個布林值,表示引數是否為set的成員。

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

var set = new set();

set.add(1).add(2).add(22).add(22);

set.size//3

set.hae(22)//true

set.has(4)//false

set.delete(2)//true

(3.3)set遍歷操作

set有四個遍歷方法。可以用於遍歷成員。

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

values() :返回乙個值的遍歷器

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

foreach():使用**函式遍歷每個成員

注意:由於set沒有鍵名,只有值名,keys()和values()返回的結果是一樣,

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

for(let item of set.keys())

//red,green,blue

for(let item of set.values())

//red,green,blue

for(let item of set.entries())

//["red","red"]

//["green","green"www.cppcns.com]

//["blue","blue"]

//所以,entries方法返回的遍歷器同時包括鍵名和值,所以每次輸出的是乙個陣列。其實成員都是完全一樣的。

注意:set預設的可遍歷,其預設遍歷器生成函式就是它的values方法。

這就意味著,可以省略values方法,直接用for…of遍歷。

var set = new set([1,2,3,4]);

for(let x of set)

//1//2

//3//4

如果使用擴充套件運算子(…)內部使用for…of 迴圈,所以也可以用於set結構。

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

let arr = [...set];

//['red','green','blue'];

(3.4)set實現並集,交集,差集

let set1 = new set([1,2,3,4,5,6]);

let set2 = new set([4,5,6,7,8,9]);

//並集

let union = new set([...set1,...set2]);

//[1,2,3,4,5,6,7,8,9]

//交集

let intersect = new set([...set1].filter(x => b.has(s)));

//[4,5,6]

//差集

let intersect = new set([...set1].filter(x => !b.has(s)));

//[1,2,3,4]

(3.5)set實現foreach的使用

let set = new set([1,2,3,4,5,6]);

set.foreach(value,key)=www.cppcns.com>consloe.log(vlaue+1);

//2//3

//4//5

//6//7

注意:foreach方法的引數就是乙個處理函式,該函式依次為(鍵值,鍵名)集合本身。另外,foreach方法還有第二個引數,表示繫結this的物件程式設計客棧。

二、weakset使用

weakset類似於set,也是不重複的值的集合。但是它只能用於儲存物件。而不能是其他型別的值。

weakset是乙個個建構函式。可以接受陣列和類似陣列的物件作為引數。(實際上,任何具作為iterable介面的物件都可以作為weaksetwww.cppcns.com的引數)。該陣列的所有成員都會自動成為weakset的例項物件的成員。

var a = new [[1,2www.cppcns.com],[3,4]];

var ws = new weakset(a);

var ws = new weakset();

ws.add(1);//typeerror:invalid value used in weak set

ws.add(symbol);//typeerror:invalid value used in weak set

添如乙個數值和乙個symbol,結果同時報錯。

weakset結構有以下的上方法

weakset.protoptype.add(value):向weakset例項新增乙個新成員。

weakset.protoptype.delete(value):刪除weakset例項指定成員。

weakset.protoptype.has(value):返回乙個布林值,表示某個值是否在weakset例項中。

var ws = new weakset();

var obj = {};

var foo = {};

ws.add(window);

ws.add(obj);

ws.has(window);//true

ws.has(foo);false

ws.delete(window);//true

ws.has(window);//false

weakset 不能遍歷,是因為成員都是弱引用,隨時可能消失,遍歷不能保證成員的存在。可能剛剛遍歷結束,成員就取不到了。weakset的乙個用處是儲存dom節點,而不用擔心這些節點從文件移除時,會引起記憶體的洩露。

本文標題: es6中如何使用set和weakset

本文位址:

ES6中Set()的使用 javaScript

記錄一波今天在專案中實踐使用es6中的set 的資料結構,感覺特別帥氣!set 可以實現在返回的一串資料的陣列中挑選出滿足你條件的資料。最大的關注點就是 去重!使用場景 後台返回乙個陣列 所有場景的 裡面包含了全景圖與非全景圖 字段下面根據imagetype 來區分,貨架分為主貨架與非主貨架 而全景...

es6中set的屬性 方法和使用

set 資料結構 類似陣列 成員資訊唯一性 新增1 add var s new set s.add ggg add 5555 console.log s set 新增2 陣列 var s2 new set rrr 123,rfggb console.log s2 set 刪除 delete 返回值 ...

es6中 使用class裡面的set和get 用法

在一些專案中,如果乙個字段,後端只返回0或1的時候,但是你業務邏輯中要將0和1對應轉換成true或者false的時候,如果直接轉的話,儲存的時候轉後端又要寫一次,非常麻煩。export class person public getactivetoboolean boolean public set...