摘要:由于和不會被轉換為字符串,所以在內部是不同的項,如果他們被轉化為字符串,那么都會等于,如果多次調用并傳入相同的值作為參數。第二次重復傳入并不會被添加到集合中,那么的屬性值還是為。的方法和共享了幾個方法。小結正式將與引入。
se5中的set與map
在est5中開發者使用對象屬性來模擬。set多用于檢查鍵的存在,map多用于提取數據。
{ let set = Object.create(null) set.foo = true; //檢查屬性是否存在 if (set.foo) { //其他操作 } let map = Object.create(null); map.foo = "一個值"; let val = map.foo; console.log("map-->:", val); //map-->:一個值" }
在簡單情況下將對象作為map和set來使用都是可行的,但是一旦接觸到對象屬性的局限性,此方式就會遇到更多的麻煩。
{ let map1 = Object.create(null), key1 = {}, key2 = {}; map1[key1] = "foo"; console.log("key2-->:", map1[key2]); let map2 = Object.create(null); map2.count = 1; //是想檢查count的存在,還是非零值? if (map2.count) { //... } }
map1[key1]和map1[key2]引用了同一個值。由于對象屬性只能是string,又因為對象默認的string表達形式是"[object object]"。導致key1和key2被轉換為同一個字符串。map2中count的用法存在歧義。該if語句內的代碼都會被執行因為1被隱式轉換為true。然而count的值為0則會被隱式轉為false。在大型應用中這類問題都是難以確認,難以調試的。這也是新增set和map類型的原因。set類型是一種無重復值的有序列表。set允許對它包含的數進行快速訪問,從而更有效的追蹤各種離散值。
創建set類型使用new set()來創建。調用add()方法向集合中添加元素,訪問集合的size屬性獲取集合數量。
{ let set = new Set(); set.add(5); set.add("5"); console.log("typeof set-->:", typeof set) console.log("set-->:", set) console.log("size-->:", set.size) }
set不會使用強制類型轉換來判斷值是否重復,這意味著set可以同時包含number(5)和string(5),唯一的例外-0和+0在set中被判定是相等的,如果向set集合中添加多個對象,則他們之間彼此獨立。
{ let set = new Set(); let key1 = {}; let key2 = {}; set.add(key1); set.add(key2); console.log("typeof setobject-->:", typeof set) console.log("setobject-->:", set) console.log("size-->:", set.size) }
由于key1和key2不會被轉換為字符串,所以在set內部是不同的項,如果他們被轉化為字符串,那么都會等于"[object object]",如果多次調用add()并傳入相同的值作為參數。那么后續的調用會被忽略。
{ let set = new Set(); set.add(5); set.add("5"); set.add(5); console.log("typeof set-->:", typeof set) console.log("set-->:", set) console.log("size-->:", set.size) }
第二次重復傳入numner(5)并不會被添加到set集合中,那么size的屬性值還是為2。也可以使用數組來初始化set集合。集合同樣會過濾重復的值。
{ let set = new Set([1, 2, 3, 4, 5, 5, 5, 5, 5, 5]); console.log("size-->:", set.size); }
通過has()可以檢測set集合中是否存在某個值。
{ let set = new Set(); set.add(5); set.add("6"); console.log("set has-->:", set.has(6)); console.log("set has-->:", set.has("6")) console.log("set has-->:", set.has(5)) console.log("set has-->:", set.has("5")) }
set集合中相同的number和sting并不會返回true。調用delete()方法可以移除set中的某一個值,調用clear()方法可以移除所有值。
{ let set = new Set(); set.add(5); set.add("6"); console.log("set has-->:", set.has("6")); set.delete("6") console.log("set has-->:", set.has("6")) console.log("size-->:", set.size) set.clear(); console.log("size-->:", set.size) }
set集合簡單易用,可以有效的跟蹤多個獨立有序的值。
set的forEachset集合和數組的forEach類似,運行機制也比較類似。forEach()方法的回調接收3個參數:
1.集合中索引的位置。
2.被遍歷參數的值
3.集合本身
{ let set = new Set(["a", "b", "c", "d", "e"]); set.forEach((k, val, owner) => { console.log("set-forEach-k-->:", k); console.log("set-forEach-val-->:", val); console.log("set-forEach-owner-->:", owner); }) }將set轉換為數組
將數組轉換為set集合的過程很簡單,需要給set集合傳入數組即可。將集合轉回數組,只需要使用展開運算符即可。
{ let arr = [1, 2, 3, 4, 5, 5, 5, 5, 5, 5]; let set = new Set(arr); let newArr = [...set]; //ps: 代碼行數太多可以壓縮下 let newArr2 = [...new Set([1, 2, 3, 4, 5, 5, 5, 5, 5, 5])]; console.log(newArr, newArr2) }創建map類型
map類型是鍵值對的有序列表,鍵和值都可以是任意類型,可以調用set()方法傳遞一個鍵和一個關聯的值,來給馬屁添加項;此后使用鍵名來調用get()方法獲取對應的值。
{ let map = new Map(); map.set("title", "es6"); map.set("year", 2016); console.log("map-title-->", map.get("title")) console.log("map-year-->", map.get("year")) }map的方法
map和set共享了幾個方法。以下的方法和屬性map和set上都存在:
1.forEach(val, k, owner): 遍歷map
2.has(key):判斷指定的鍵值是否存在
3.delete(key):移除map中鍵以及對應的值
4.clear():移除map中所有的鍵和值
5.size:指明包含多個鍵值對。
{ let map = new Map(); map.set("title", "es6"); map.set("year", 2016); map.forEach((val, k, owner) => { console.log("map-forEach-k-->:", k); console.log("map-forEach-val-->:", val); console.log("map-forEach-owner-->:", owner); }) console.log("map-size-->:", map.size); console.log("map-has-->:", map.has("title")); map.delete("title"); console.log("map-->:", map); map.clear(); console.log("map-->:", map); }小結
es6正式將set與map引入。在此之前往往使用對象來模擬,但是由于與對象屬性有關的限制,這么做會經常遇到問題。
這里并沒有弱引用weakset和weakmap,有這方面需要的可以自己去查閱
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/95329.html
摘要:將對象當做的一個鍵獲取鍵為的值刪除鍵為的鍵值對判斷是否包含鍵值對但是我在看阮一峰的的時候,看到一些針對自己的問題,不太好理解。 在JS的對象(Object)中,本質是就是鍵值對的集合(HASH) { name:Kisn, Brith:941018 } 但是在實際情況使用中,我們不能很好地使用它,它也會導致很多意外。特別是,我想要一個動態的鍵時. const data = {}; con...
摘要:事實上,不僅僅是數組,任何具有接口且每個成員都是一個雙元素的數組的數據結構都可以當做構造函數的參數。返回所有成員的遍歷器需要特別注意的是,的遍歷順序就是插入順序。轉為轉為,正常情況下,所有鍵名都是字符串。 Map JavaScript 的對象(Object),本質上是鍵值對的集合(Hash 結構),但是傳統上只能用字符串當作鍵。這給它的使用帶來了很大的限制。為了解決這個問題,ES6 提...
摘要:返回一個布爾值,表示該值是否為的成員。清除所有成員,沒有返回值。該數組中的每一項也必須是數組,內部數組的首個項會作為鍵,第二項則為對應值。返回所有成員的遍歷器需要特別注意的是,的遍歷順序就是插入順序。 Js大部分歷史時期都只存在一種集合類型,也就是數組類型。數組在 JS 中的使用正如其他語言的數組一樣,但缺少更多類型的集合導致數組也經常被當作隊列與棧來使用。數組只使用了數值型的索引,而...
摘要:中模擬與長久以來,數組一直是中唯一的集合類型。用數組初始化集合事實上,只要是可迭代對象數組集合集合,都可以作為構造函數的參數。構造函數通過迭代器從參數中提取值。 ES5中模擬Set與Map 長久以來,數組一直是JavaScript中唯一的集合類型。如果開發者們需要使用非數值型索引,就會用非數組對象創建所需的數據結構,而這就是Set集合與Map集合的早期實現。 一般來說,Set集合常被用...
閱讀 2645·2021-11-23 09:51
閱讀 912·2021-09-24 10:37
閱讀 3630·2021-09-02 15:15
閱讀 1972·2019-08-30 13:03
閱讀 1893·2019-08-29 15:41
閱讀 2638·2019-08-29 14:12
閱讀 1436·2019-08-29 11:19
閱讀 3313·2019-08-26 13:39