摘要:類似于與的區(qū)別和的對比與對比數(shù)據(jù)結構橫向對比,增查改刪增查改刪與對比增查改刪與對比增查改刪建議優(yōu)先使用,不使用,特別是復雜的數(shù)據(jù)結構考慮數(shù)據(jù)唯一性,使用,放棄和
Set
1.add()方法和size屬性
{ let list = new Set(); // add()方法向Set數(shù)據(jù)添加元素 list.add(5); list.add(7); // size屬性返回數(shù)據(jù)的長度 console.log(list.size); // 2 let arr = [1, 2, 3, 4, 5]; let set = new Set(arr); console.log(set, set.size); // Set(5)?{1, 2, 3, 4, 5} 5 }
2.Set的元素必須是唯一的
{ let list = new Set(); list.add(1); list.add(2); list.add(1); // 重復元素不會添加進去 console.log(list); // Set(2)?{1, 2} // 數(shù)組去重 let arr = [1, 2, 3, 1, "2"]; let list2 = [...new Set(arr)]; console.log(list2); // [1, 2, 3, "2"] }
3.has(),delete(),clear()
{ let arr = ["add", "delete", "clear", "has"]; let list = new Set(arr); console.log(list.has("add")); // true list.delete("add"); console.log(list); // Set(3)?{"delete", "clear", "has"} list.clear(); console.log(list); // Set(0)?{} }
4.Set的遍歷
{ let arr = ["add", "delete", "clear", "has"]; let list = new Set(arr); // Set結構的數(shù)據(jù),key和value是同一個值 for (let value of list) { console.log("value", value); // "add" "delete" "clear" "has" } for (let key of list.keys()) { console.log("keys", key); // "add" "delete" "clear" "has" } for (let value of list.values()) { console.log("values", value); // "add" "delete" "clear" "has" } for (let [key, value] of list.entries()) { console.log("entries", key, value); } list.forEach(function (item) { console.log(item); // "add" "delete" "clear" "has" }); }WeakSet
WeakSet和Set的不同點:
WeakSet的元素只能是對象,不能是數(shù)值、字符串、布爾值...
WeakSet中的對象都是弱引用,垃圾回收機制不考慮WeakSet對該對象的引用。WeakSet里面的引用,都不計入垃圾回收機制,所以不會引發(fā)內存泄漏的問題。所以,WeakSet適合臨時存放一組對象,以及存放跟對象綁定的信息。只要這些對象在外部消失,它在WeakSet里面的引用就會自動消失。
{ let weakList = new WeakSet(); let arg = {name: "hhh"}; weakList.add(arg); // WeakSet的元素只能是對象 // weakList.add(2); // Uncaught TypeError: Invalid value used in weak set console.log(weakList); // WeakSet?{{name: "hhh"}} // 注意:WeakSet沒有size屬性,沒有clear方法,不能遍歷。其他的用法和Set相同 }Map
1.set()方法和get()方法
{ let map = new Map(); let arr = ["123"]; // Map的key可以是任意數(shù)據(jù)類型 map.set(arr, 456); // map.set(key, value),這里用數(shù)組作為key,添加一個值為456的元素 console.log(map.get(arr)); // 456 }
2.Map的另一種定義方式
{ let map = new Map([["a", 123], ["b", 456]]); // 接收一個數(shù)組作為參數(shù),數(shù)組的每一項為:[key,value] console.log(map); // Map(2)?{"a" => 123, "b" => 456} console.log(map.size); // 2 console.log(map.has("b")); // true map.delete("a"); console.log(map); // Map(1)?{"b" => 456} map.clear(); console.log(map); // Map(0)?{} }WeakMap
WeakMap和Map的不同點:
WeakMap的key只能是對象
WeakMap的鍵名所引用的對象都是弱引用,垃圾回收機制不考慮對此對象的引用。(注意,WeakMap弱引用的只是鍵名,而不是鍵值。鍵值依然是正常引用。)基本上,如果你要往對象上添加數(shù)據(jù),又不想干擾垃圾回收機制,就可以使用WeakMap。
{ let weakmap = new WeakMap(); let o = {}; weakmap.set(o, 123); console.log(weakmap.get(o)); // 123 // 注意:WeakMap沒有size屬性,沒有clear方法,不能遍歷。類似于Set與WeakSet的區(qū)別 }Set,Map和Array,Object的對比 Map與Array對比
{ // 數(shù)據(jù)結構橫向對比,增 查 改 刪 let map = new Map(); let array = []; // 增 map.set("t", 1); array.push({"t": 1}); console.log(map, array); // {"t" => 1} [{"t": 1}] // 查 let map_exist = map.has("t"); let array_exist = array.find(item => item.t); console.log(map_exist, array_exist); // true {t: 1} // 改 map.set("t", 2); array.forEach(item => item.t ? item.t = 2 : ""); console.log(map, array); // {"t" => 2} [{"t": 2}] // 刪 map.delete("t"); let index = array.findIndex(item => item.t); array.splice(index, 1); console.log(map, array); // {} [] }Set與Array對比
{ let set = new Set(); let array = []; let item = {"t": 1}; // 增 set.add(item); array.push(item); console.log(set, array); // {{"t": 1}} [{"t": 1}] // 查 let set_exist = set.has(item); let array_exist = array.find(item => item.t); console.log(set_exist, array_exist); // true {t: 1} // 改 set.forEach(item => item.t ? item.t = 2 : ""); array.forEach(item => item.t ? item.t = 2 : ""); console.log(set, array); // {{"t": 2}} [{"t": 2}] // 刪 set.forEach(item => item.t ? set.delete(item) : ""); let index = array.findIndex(item => item.t); array.splice(index, 1); console.log(set, array); // {} [] }Map,Set與Object對比
{ let item = {t: 1}; let map = new Map(); let set = new Set(); let obj = {}; // 增 map.set("t", 1); set.add(item); obj["t"] = 1; console.log(obj, map, set); // {t: 1} Map(1)?{"t" => 1} Set(1)?{{t: 1}} // 查 console.log(map.has("t"), set.has(item), "t" in obj); // true true true // 改 map.set("t", 2); item.t = 2; obj["t"] = 2; console.log(obj, map, set); // {t: 2} Map(1)?{"t" => 2} Set(1)?{{t: 2}} // 刪 map.delete("t"); set.delete(item); delete obj["t"]; console.log(obj, map, set); // {} Map(0)?{} Set(0)?{} }
建議:
優(yōu)先使用map,不使用array,特別是復雜的數(shù)據(jù)結構
考慮數(shù)據(jù)唯一性,使用set,放棄array和obj
文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/98691.html
摘要:函數(shù)調用會在內存形成一個調用記錄,又稱調用幀,保存調用位置和內部變量等信息。等到運行結束,將結果返回到,的調用幀才會消失。方法用于將一組值,轉換為數(shù)組。,和遍歷數(shù)組方法返回一個布爾值,表示某個數(shù)組是否包含給定的值,與字符串的方法類似。 ES6 簡介 ES6, 全稱 ECMAScript 6.0 ,是 JavaScript 的下一個版本標準,2015.06 發(fā)版。 let 和 const...
摘要:看代碼及注釋就懂了把代碼轉換為代碼解構賦值字符串反引號代替引號代替了正則表達式匹配數(shù)組展開符利用的實現(xiàn)對象對象屬性有屬性有值集合和添加元素,但是不會添加相同的元素,利用這個特性實現(xiàn)數(shù)組去重元素數(shù)量是否有指定元素刪除元 看代碼及注釋就懂了 把ES6(es2015)代碼轉換為ES5代碼 $ npm install -g babel-cli $ npm install babel-pres...
摘要:一概述集合是引入的新的內置對象類型,其特點同數(shù)學意義的集合,即集合內所有元素不重復元素唯一。數(shù)組集合對比數(shù)組和集合,數(shù)組可以加入重復數(shù)據(jù),而集合的所有元素是唯一的不允許重復。因此,適合臨時存放一組對象,以及存放跟對象綁定的信息。 本文同步帶你入門 帶你入門 JavaScript ES6 (五) 集合,轉載請注明出處。 前面我們學習了: for of 變量和擴展語法 塊作用域變量和解構...
showImg(https://user-gold-cdn.xitu.io/2019/5/22/16adcec448a45d82); 1. Object.is() 用來解決在ES5中 兩種相等運算符的缺點。用來比較兩個值是否嚴格相等,行為和(===)基本一致。 在ES5中判斷兩個值是否相等,只能用(==)相等運算符和(===)嚴格相等運算符,但是這兩貨都有缺點,前者 兩邊的值都會轉換數(shù)據(jù)類型,...
閱讀 2222·2021-09-24 10:31
閱讀 3875·2021-09-22 15:16
閱讀 3395·2021-09-22 10:02
閱讀 1010·2021-09-22 10:02
閱讀 1822·2021-09-08 09:36
閱讀 1974·2019-08-30 14:18
閱讀 609·2019-08-30 10:51
閱讀 1863·2019-08-29 11:08