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