首頁 >web前端 >前端問答 >es6的set有什麼用

es6的set有什麼用

青灯夜游
青灯夜游原創
2022-10-24 17:55:551916瀏覽

Set是一種用於儲存有序資料的資料結構,Set中的元素具有唯一性,不允許儲存相同的元素;Set()可以接受一個可迭代物件作為參數,但是會將這個可迭代物件中相同的內容移除,因此可用於去除重複元素,預防「Array.from(new Set(arr))」或「[...new Set(arr)]」。

es6的set有什麼用

本教學操作環境:windows7系統、ECMAScript 6版、Dell G3電腦。

一、基本用法

SetES6 提供的一種新的資料結構,它跟陣列一樣用於儲存有序的數據,但是沒有隨機存取的能力,也就是說,不能像數組一樣透過索引來獲取具體的某個元素。 除此之外,最重要的是,Set 中的元素具有唯一性,不允許儲存相同的元素!

Set 是一個建構函數,用於實例化實例:

let set = new Set()
set.add(1)//往set集合中添加元素1

除此以外,Set() 可以接受一個可迭代物件作為參數,以作為實例初始化的數據,但是會將這個可迭代物件中相同的內容去除,然而,這也是數組去重的一個方法。

let set = new Set([1,2,2,1,4,3,5])
console.log(set)//Set(5) {1, 2, 4, 3, 5}

由元素唯一性這個特點,可以利用在數組去重上:

//方法一:
Array.from(new Set(arr)) //arr是待去重的数组

//方法二:
[...new Set(arr)]

太酷了吧,類似的,利用這個特性還能實現字串相同字元的去重。

[...new Set(str)].join('')

然而,上面都是透過 Set 類型元素的唯一性來實現的,那麼 Set 內部是如何判斷元素是否唯一的呢?它的內部使用了一個演算法 Same-value-zero equality ,大致與全等運算子一致,差異在於這種演算法認為 NaN 等於 NaN

二、實例屬性與方法

實例屬性

Set.prototype 上,定義了一個屬性size 表示元素的個數。

let set = new Set([1,2,2,1,4,3,5])
console.log(set.size)//5

實例方法

Set 實例的方法可以分為兩類:操作方法與遍歷方法。

1.操作方法

  • Set.prototype.add(value) —— 將某個值加到Set 的結尾,傳回Set 本身。
  • Set.prototype.delete(value) —— 刪除某個值,回傳布林值,表示是否刪除成功。
  • Set.prototype.has(value) —— 傳回布林值,表示該值是否為 Set 的元素。
  • Set.prototype.clear() —— 清除所有成員,沒有回傳值。

值得一提的是,add() 方法的回傳是Set 本身,所以你應該可以想到鍊式呼叫:

let set = new Set()
set.add(1).add(2).add(3)

2.遍歷方法

  • Set.prototype.keys() —— 傳回鍵名的遍歷器
  • #Set.prototype.values() —— 傳回鍵值的遍歷器
  • Set.prototype.entries() —— 傳回鍵值對的遍歷器
  • Set.prototype.forEach() —— 使用回呼函數遍歷元素

由於Set 結構沒有鍵名,只有鍵值(或者說鍵名和鍵值是同一個值),所以keys 方法和values 方法的行為完全一致。

三、WeakSet

#WeakSetSet 的升級版,主要有兩個區別:

  • WeakSet 只能儲存引用類型,不能儲存基本類型資料。
  • WeakSet 中的參考類型都是弱引用。

首先,第一點很好理解,就是無法儲存基本類型的資料:

const ws = new WeakSet()
ws.add(1)//报错,Invalid value used in weak set

然後第二點,WeakSet 中的物件都是弱引用。也意味著垃圾回收機制不會考慮 WeakSet 對該物件的引用,一旦在外部引用計數為0,那麼就等著被垃圾回收機制處理。所以,WeakSet 適合暫時存放一組物件。

由於這個特徵,WeakSet 中的成員是不適合引用的,因為它很可能隨時會被清理,然而,ES6 規定它是不可遍歷的。

WeakSet 中的方法也跟著上面提到的 Set 基本上一致,但是它沒有 size 屬性,沒有遍歷器方法。

【相關推薦:javascript影片教學程式設計影片

以上是es6的set有什麼用的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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