首頁 web前端 js教程 ES6中如何使用Set和WeakSet_javascript技巧

ES6中如何使用Set和WeakSet_javascript技巧

May 16, 2016 pm 03:11 PM
es6 set

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){console.log(i)}
//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()){
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方法返回的遍历器同时包括键名和值,所以每次输出的是一个数组。其实成员都是完全一样的。

登入後複製

注意:Set預設的可遍歷,其預設遍歷器產生函數就是它的values方法。
這意味著,可以省略values方法,直接用for…of遍歷。

var set = new Set([1,2,3,4]);
for(let x of set){
console.log(x);
}
//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)=>consloe.log(vlaue+1);
//2
//3
//4
//5
//6
//7
登入後複製

注意:forEach方法的參數就是一個處理函數,該函數依序為(鍵值,鍵名)集合本身。另外,forEach方法還有第二個參數,表示綁定this的物件。

二、WeakSet使用

WeakSet類似Set,也是不重複的值的集合。但是它只能用於儲存物件。而不能是其他類型的值。
WeakSet是一個個建構子。可以接受數組和類似數組的物件作為參數。 (實際上,任何具作為iterable介面的物件都可以作為WeakSet的參數)。該數組的所有成員都會自動成為WeakSet的實例物件的成員。
var a = new [[1,2],[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節點,而不用擔心這些節點從文件移除時,會造成記憶體的外洩。

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

詳解MyBatis動態SQL標籤中的Set標籤功能 詳解MyBatis動態SQL標籤中的Set標籤功能 Feb 26, 2024 pm 07:48 PM

MyBatis動態SQL標籤解讀:Set標籤用法詳解MyBatis是一個優秀的持久層框架,它提供了豐富的動態SQL標籤,可以靈活地建構資料庫操作語句。其中,Set標籤是用來產生UPDATE語句中SET子句的標籤,在更新作業中非常常用。本文將詳細解讀MyBatis中Set標籤的用法,以及透過具體的程式碼範例來示範其功能。什麼是Set標籤Set標籤用於MyBati

async是es6還是es7的 async是es6還是es7的 Jan 29, 2023 pm 05:36 PM

async是es7的。 async和await是ES7中新增內容,是對於非同步操作的解決方案;async/await可以說是co模組和生成器函數的語法糖,用更清晰的語意解決js非同步程式碼。 async顧名思義是「非同步」的意思,async用於聲明一個函數是異步的;async和await有一個嚴格規定,兩者都離不開對方,且await只能寫在async函數中。

ES6怎麼求數組反轉 ES6怎麼求數組反轉 Oct 26, 2022 pm 06:19 PM

在ES6中,可以利用數組物件的reverse()方法來實現數組反轉,該方法用於顛倒數組中元素的順序,將最後一個元素放在第一位,而第一個元素放在最後,語法「array.reverse()」。 reverse()方法會修改原始數組,如果不想修改需要配合擴充運算子「...」使用,語法「[...array].reverse()」。

小程式為什麼要將es6轉es5 小程式為什麼要將es6轉es5 Nov 21, 2022 pm 06:15 PM

為了瀏覽器相容。 ES6作為JS的新規範,加入了許多新的語法和API,但現代瀏覽器對ES6新特性支援不高,所以需將ES6程式碼轉換為ES5程式碼。在微信web開發者工具中,會預設使用babel將開發者ES6語法程式碼轉換為三端都能很好支援的ES5的程式碼,幫助開發者解決環境不同所帶來的開發問題;只需要在專案中配置勾選好「ES6轉ES5」選項即可。

es6怎麼找出2個數組中不同項 es6怎麼找出2個數組中不同項 Nov 01, 2022 pm 06:07 PM

步驟:1、將兩個陣列分別轉換為set類型,語法「newA=new Set(a);newB=new Set(b);」;2、利用has()和filter()求差集,語法“ new Set([...newA].filter(x =>!newB.has(x)))”,差集元素會被包含在一個set集合中返回;3、利用Array.from將集合轉為數組類型,語法“Array.from(集合)”。

es5和es6怎麼實現陣列去重 es5和es6怎麼實現陣列去重 Jan 16, 2023 pm 05:09 PM

es5中可以利用for語句和indexOf()函數來實現數組去重,語法“for(i=0;i<數組長度;i++){a=newArr.indexOf(arr[i]);if(a== -1){...}}」。在es6中可以利用擴充運算子、Array.from()和Set來去重;需要先將陣列轉為Set物件來去重,然後利用擴充運算子或Array.from()函數來將Set物件轉回數組即可。

es6暫時性死區是什麼意思 es6暫時性死區是什麼意思 Jan 03, 2023 pm 03:56 PM

在es6中,暫時性死區是語法錯誤,是指let和const命令使區塊形成封閉的作用域。在程式碼區塊內,使用let/const指令宣告變數之前,變數都是不可用的,在變數宣告之前屬於該變數的「死區」;這在語法上,稱為「暫時性死區」。 ES6規定暫時性死區和let、const語句不出現變量提升,主要是為了減少運行時錯誤,防止在變量聲明前就使用這個變量,從而導致意料之外的行為。

es6 map有序嗎 es6 map有序嗎 Nov 03, 2022 pm 07:05 PM

map是有序的。 ES6中的map類型是一種儲存著許多鍵值對的有序列表,其中的鍵名和對應的值支持所有數據類型;鍵名的等價性判斷是通過調用“Objext.is()”方法來實現的,所以數字5與字串「5」會被判定為兩種類型,可以分別作為兩種獨立的鍵出現在程式中。

See all articles