<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                [TOC] >[success] # Set -- 存儲任何類型的唯一值 ~~~ 1. Set 對象允許你存儲任何類型的唯一值,無論是原始值或者是對象引用。 2. Set對象是值的集合,你可以按照插入的順序迭代它的元素。 Set中的元素 只會出現一次,即 Set 中的元素是唯一的. 3.原理:Set 的內部比較使用的是'Object.is',所以是可以判斷類型的也就是說 即使存儲的值是NaN,但是要注意的'Object.is' 是區分'+0'和'-0',但在'set' 是不區分的 ~~~ >[info] ## Set 使用 ~~~ 1.'Set' 是構造函數,因此創建的時候需要'new' 一個實例 ~~~ >[danger] ##### 創建Set并添加值 * 第一種使用add 方法添加 ~~~ 1.下面案例解釋'key'和'key1'的疑惑即使向key 和 key1 他們賦值雖然都是'{}' 但要注意他們的內存地址是不一樣,因此其實兩個是就好比是雙胞胎看起來 一樣實際是兩個人 2.通過add 兩次'key1' 最后結果只有一個'key1'可以看出'Set' 具有去重的效果(數組和字符串) 3.用下面的key 或者key1 放入set ,set不會釋放掉key,所以當使用完想完全 釋放可能需要將key = null 也可以用下面的WeakSet,會自動釋放 ~~~ ~~~ const key = {} const key1 = {} console.log(Object.is(key,key1)) // false const set = new Set() set.add('5') set.add(5) set.add(key) set.add(key1) set.add(key1) console.log(set) // Set?{"5", 5,{},{}} ~~~ * 通過構造函數傳值賦值 ~~~ 1.'Set' 的構造函數可以接受所有可迭代對象作為參數例如,'數組'、'set集合'、'Map集合',正是因為是 可迭代對象因此普通的Object 是不能作為構造函數傳值賦值,可以使用'Object.entries' 將對象轉換成 可迭代對象 ~~~ ~~~ // 數組 const array = [1,1,2,3,5] const set = new Set(array) // Set 集合 const set1 = new Set(set) // Map 對象 const map = new Map() map.set("name",'wang') map.set("age",'17') const set2 = new Set(map) console.log(set,set1,set2) // 打印結果: Set(4)?{1, 2, 3, 5} Set(4)?{1, 2, 3, 5} Set(2)?{["name","wang"], ["age","17"]} // 用Object.entries轉換對象為可迭代對象 const set = new Set(Object.entries({name:'w',age:16})) console.log(set) ~~~ >[danger] ##### 獲取集合Set 長度 -- size ~~~ // 數組 const array = [1,1,2,3,5] const set = new Set(array) console.log(set.size) // 4 ~~~ >[danger] ##### 判斷當前值是否存在集合/刪除集合中的元素 -- has/delets、clear ~~~ // 數組 const array = [1,1,2,3,5] const set = new Set(array) console.log(set.has(1)) // true set.delete(1) console.log(set.has(1)) // false // 全部刪除 set.clear() console.log(set.has(2))// false ~~~ >[danger] ##### 遍歷操作 ~~~ 1.這里要注意下,由于 Set 結構沒有鍵名,只有鍵值(或者說鍵名和鍵值是同一個值) ,所以keys方法和values方法的行為完全一致 2.下面案例的第一個循環'set' 實例,雖然set 的keys 和 values 是一樣的但是,其中循環 set實例打印打的其實是'values' 也就是說循環實例 和循環 values 是一樣的 Set.prototype.keys():返回鍵名的遍歷器 Set.prototype.values():返回鍵值的遍歷器 Set.prototype.entries():返回鍵值對的遍歷器 Set.prototype.forEach():使用回調函數遍歷每個成員 ~~~ ~~~ // 數組 const array = [1,1,2,3,5] const set = new Set(array) console.log(set.values()) // SetIterator?{1, 2, 3, 5} console.log(set.keys()) // SetIterator?{1, 2, 3, 5} console.log(set.entries()) // SetIterator?{1 => 1, 2 => 2, 3 => 3, 5 => 5} for (let item of set) { console.log(item); } for (let item of set.values()) { console.log(item); } for (let item of set.keys()) { console.log(item); } for(let item of set.entries()){ console.log(item) } // 打印結果前三個循環結果是一樣的: 1 2 3 5 // 最后一個循環結果: ?[1, 1] ?[2, 2] ?[3, 3] ?[5, 5] ~~~ >[danger] ##### 使用forEach ~~~ 1.'Set' 和數組一樣也可以使用'forEach',也是回調接受三個參數分別是: 1.1.元素的值 1.2.元素的索引 1.3.正在遍歷的集合對象 2.對上面要解釋一下其中1.1 和 1.2 由于集合對象中沒有索引(keys), 所以前兩個參數都是Set中元素的值(values) ~~~ ~~~ // 數組 const array = [1,1,2,3,5] const set = new Set(array) set.forEach((key,value,currentObj)=>{ console.log(key,value) console.log(currentObj) }) ~~~ * 打印結果 ![](https://img.kancloud.cn/77/71/777149481d89cac490861878fe945f1d_286x173.png) >[danger] ##### Set 不能像數組一樣通過腳標取值 ~~~ 1.集合對象中沒有索引,因此不能像數組一樣腳標取值 ~~~ >[danger] ##### 通過轉換成數組解決上面的問題 ~~~ // 數組 const array = [1,1,2,3,5] const set = new Set(array) setArray = [...set] setArray1 = [...new Set(array)] console.log(setArray,setArray1) // [1,2,3,5] ~~~ >[danger] ##### 并集(Union)、交集(Intersect)和差集(Difference)** ~~~ let a = new Set([1, 2, 3]); let b = new Set([4, 3, 2]); // 并集 let union = new Set([...a, ...b]); // Set {1, 2, 3, 4} // 交集 let intersect = new Set([...a].filter(x => b.has(x))); // set {2, 3} // 差集 let difference = new Set([...a].filter(x => !b.has(x))); // Set {1} ~~~ >[info]## WeakSet ~~~ 1.WeakSet 和Set 不同只有以下方法: WeakSet.prototype.add(value):向 WeakSet 實例添加一個新成員。 WeakSet.prototype.delete(value):清除 WeakSet 實例的指定成員。 WeakSet.prototype.has(value):返回一個布爾值,表示某個值是否在 2.也就是說WeakSet 不能循環 沒有keys 和 values 屬性,因為WeakSet只是對對象的弱引用, 如果我們遍歷獲取到其中的元素,那么有可能造成對象不能正常的銷毀 3.WeakSet 的成員只能是對象,而不能是其他類型的值 4.WeakSet 對象中存儲的對象值都是被弱引用的, 如果沒有其他的變量或屬性 引用這個對象值, 則這個對象值會被當成垃圾回收掉. 正因為這樣, WeakSet 對象是無法被枚舉的, 沒有辦法拿到它包含的所有元素. ~~~ >[danger] ##### 創建一個WeakSet * WeakSet 的成員只能是對象,而不能是其他類型的值 ~~~ const ws = new WeakSet(); ws.add(1) // TypeError: Invalid value used in weak set ws.add(Symbol()) // TypeError: invalid value used in weak set ~~~ * 正常創建 ~~~ const a = [[1, 2], [3, 4]]; const ws = new WeakSet(a); // WeakSet {[1, 2], [3, 4]} ~~~ >[danger] ##### set 當然也可以鏈式 ~~~ const s = new Set() s.add(1).add(2).add(3).add(4).add(2) ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看