目錄
Set
Set 中的特殊值
1、
Map 和 Object 的区别
Map 的属性
Map 对象的方法
遍历方法
数据类型转化
Map的应用
WeakMap
总结
首頁 web前端 js教程 帶你了解ES6的Set,WeakSet,Map和WeakMap

帶你了解ES6的Set,WeakSet,Map和WeakMap

Jun 20, 2020 am 09:43 AM
es6 javascript 前端

之前在學習ES6 的時候,看到SetMap,不知道其應用場景有哪些,只覺得很多時候會用在數組去重和資料存儲,後來慢慢才領悟Set 是一種叫做集合的資料結構,Map 是一種叫做字典的資料結構。

本文在gitthub做了收錄:github.com/Michael-lzg…

Set

Set 本身就是一個建構函數,用來生成Set 資料結構。 Set 函數可以接受一個陣列(或具有 iterable 介面的其他資料結構)作為參數,用來初始化。 Set 物件允許你儲存任何類型的值,無論是原始值或是物件參考。它類似於數組,但是成員的值都是唯一的,沒有重複的值。

const s = new Set()
[2, 3, 5, 4, 5, 2, 2].forEach((x) => s.add(x))
for (let i of s) {
  console.log(i)
}
// 2 3 5 4
登入後複製

Set 中的特殊值

Set 物件儲存的值總是唯一的,所以需要判斷兩個值是否恆等。有幾個特殊值需要特殊對待:

  • 0 與-0 在儲存判斷唯一性的時候是恆等的,所以不重複
  • ##undefinedundefined 是恆等的,所以不重複
  • NaNNaN 是不恆等的,但在Set 中認為NaNNaN 相等,所有隻能存在一個,不重複。
Set 的屬性:

  • size:傳回集合所包含元素的數量
const items = new Set([1, 2, 3, 4, 5, 5, 5, 5])
items.size // 5
登入後複製
Set 實例對象的方法

  • add(value):新增某個值,回傳Set 結構本身(可以鍊式呼叫)。
  • delete(value):刪除某個值,刪除成功回傳 true,否則回傳 false
  • has(value):傳回布林值,表示該值是否為 Set 的成員。
  • clear():清除所有成員,沒有回傳值。
s.add(1).add(2).add(2)
// 注意2被加入了两次

s.size // 2

s.has(1) // true
s.has(2) // true
s.has(3) // false

s.delete(2)
s.has(2) // false
登入後複製
遍歷方法

  • keys():傳回鍵名的遍歷器。
  • values():傳回鍵值的遍歷器。
  • entries():傳回鍵值對的遍歷器。
  • forEach():使用回呼函數遍歷每個成員。
由於

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"]
登入後複製
Array 和Set 對比

  • Array#indexOf 方法比Sethas 方法效率低
  • Set 不含重複值(可以利用這個特性實作對一個陣列的去重)
  • ##Set
  • 經由delete 方法刪除某個值,而Array 只能透過splice。兩者的使用方便程度前者比較優
  • Array
  • 的許多新方法mapfiltersomeevery 等是Set 沒有的(但透過兩者可以互相轉換來使用)
  • Set 的應用

1、

Array.from

方法可以將Set 結構轉為陣列。 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">const items = new Set([1, 2, 3, 4, 5]) const array = Array.from(items)</pre><div class="contentsignin">登入後複製</div></div>2、陣列去重

// 去除数组的重复成员
;[...new Set(array)]

Array.from(new Set(array))
登入後複製

3、陣列的

map

filter 方法也可以間接用於Set #<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">let set = new Set([1, 2, 3]) set = new Set([...set].map((x) =&gt; x * 2)) // 返回Set结构:{2, 4, 6} let set = new Set([1, 2, 3, 4, 5]) set = new Set([...set].filter((x) =&gt; x % 2 == 0)) // 返回Set结构:{2, 4}</pre><div class="contentsignin">登入後複製</div></div>4、實作並集

(Union)

、交集(Intersect) 和差集<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">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) =&gt; b.has(x))) // set {2, 3} // 差集 let difference = new Set([...a].filter((x) =&gt; !b.has(x))) // Set {1}</pre><div class="contentsignin">登入後複製</div></div>weakSet

#WeakSet

結構與Set 類似,也是不重複的值的集合。

成員都是數組和類似數組的對象,若調用
    add()
  • 方法時傳入了非數組和類似數組的對象的參數,就會拋出錯誤。
    const b = [1, 2, [1, 2]]
    new WeakSet(b) // Uncaught TypeError: Invalid value used in weak set
    登入後複製
成員都是弱引用,可以被垃圾回收機制回收,可以用來保存 DOM 節點,而且不容易造成記憶體洩漏。
  • WeakSet
  • 不可迭代,因此不能用在 for-of 等迴圈中。
  • WeakSet
  • 沒有 size 屬性。
  • Map

Map

中儲存的是key-value 形式的鍵值對, 其中的keyvalue 可以是任何類型的, 即物件也可以作為keyMap 的出現,就是讓各種類型的值都可以當作鍵。 Map 提供的是 “值-值”的對應。 <h4 id="Map-和-Object-的区别">Map 和 Object 的区别</h4> <ol> <li> <code>Object 对象有原型, 也就是说他有默认的 key 值在对象上面, 除非我们使用 Object.create(null)创建一个没有原型的对象;

  • Object 对象中, 只能把 StringSymbol 作为 key 值, 但是在 Map 中,key 值可以是任何基本类型(String, Number, Boolean, undefined, NaN….),或者对象(Map, Set, Object, Function , Symbol , null….);
  • 通过 Map 中的 size 属性, 可以很方便地获取到 Map 长度, 要获取 Object 的长度, 你只能手动计算
  • Map 的属性

    • size: 返回集合所包含元素的数量
    const map = new Map()
    map.set('foo', ture)
    map.set('bar', false)
    map.size // 2
    登入後複製

    Map 对象的方法

    • set(key, val): 向 Map 中添加新元素
    • get(key): 通过键值查找特定的数值并返回
    • has(key): 判断 Map 对象中是否有 Key 所对应的值,有返回 true,否则返回 false
    • delete(key): 通过键值从 Map 中移除对应的数据
    • clear(): 将这个 Map 中的所有元素删除
    const m = new Map()
    const o = { p: 'Hello World' }
    
    m.set(o, 'content')
    m.get(o) // "content"
    
    m.has(o) // true
    m.delete(o) // true
    m.has(o) // false
    登入後複製

    遍历方法

    • keys():返回键名的遍历器
    • values():返回键值的遍历器
    • entries():返回键值对的遍历器
    • forEach():使用回调函数遍历每个成员
    const map = new Map([
      ['a', 1],
      ['b', 2],
    ])
    
    for (let key of map.keys()) {
      console.log(key)
    }
    // "a"
    // "b"
    
    for (let value of map.values()) {
      console.log(value)
    }
    // 1
    // 2
    
    for (let item of map.entries()) {
      console.log(item)
    }
    // ["a", 1]
    // ["b", 2]
    
    // 或者
    for (let [key, value] of map.entries()) {
      console.log(key, value)
    }
    // "a" 1
    // "b" 2
    
    // for...of...遍历map等同于使用map.entries()
    
    for (let [key, value] of map) {
      console.log(key, value)
    }
    // "a" 1
    // "b" 2
    登入後複製

    数据类型转化

    Map 转为数组

    let map = new Map()
    let arr = [...map]
    登入後複製

    数组转为 Map

    Map: map = new Map(arr)
    登入後複製

    Map 转为对象

    let obj = {}
    for (let [k, v] of map) {
      obj[k] = v
    }
    登入後複製

    对象转为 Map

    for( let k of Object.keys(obj)){
      map.set(k,obj[k])
    }
    登入後複製

    Map的应用

    在一些 Admin 项目中我们通常都对个人信息进行展示,比如将如下信息展示到页面上。传统方法如下。

    <p class="info-item">
      <span>姓名</span>
      <span>{{info.name}}</span>
    </p>
    <p class="info-item">
      <span>年龄</span>
      <span>{{info.age}}</span>
    </p>
    <p class="info-item">
      <span>性别</span>
      <span>{{info.sex}}</span>
    </p>
    <p class="info-item">
      <span>手机号</span>
      <span>{{info.phone}}</span>
    </p>
    <p class="info-item">
      <span>家庭住址</span>
      <span>{{info.address}}</span>
    </p>
    <p class="info-item">
      <span>家庭住址</span>
      <span>{{info.duty}}</span>
    </p>
    登入後複製

    js 代码

    mounted() {
      this.info = {
        name: 'jack',
        sex: '男',
        age: '28',
        phone: '13888888888',
        address: '广东省广州市',
        duty: '总经理'
      }
    }
    登入後複製

    我们通过 Map 来改造,将我们需要显示的 label 和 value 存到我们的 Map 后渲染到页面,这样减少了大量的html代码

    <template>
      <p id="app">
        <p class="info-item" v-for="[label, value] in infoMap" :key="value">
          <span>{{label}}</span>
          <span>{{value}}</span>
        </p>
      </p>
    </template>
    登入後複製

    js 代码

    data: () => ({
      info: {},
      infoMap: {}
    }),
    mounted () {
      this.info = {
        name: 'jack',
        sex: '男',
        age: '28',
        phone: '13888888888',
        address: '广东省广州市',
        duty: '总经理'
      }
      const mapKeys = ['姓名', '性别', '年龄', '电话', '家庭地址', '身份']
      const result = new Map()
      let i = 0
      for (const key in this.info) {
        result.set(mapKeys[i], this.info[key])
        i++
      }
      this.infoMap = result
    }
    登入後複製

    WeakMap

    WeakMap 结构与 Map 结构类似,也是用于生成键值对的集合。

    • 只接受对象作为键名(null 除外),不接受其他类型的值作为键名
    • 键名是弱引用,键值可以是任意的,键名所指向的对象可以被垃圾回收,此时键名是无效的
    • 不能遍历,方法有 getsethasdelete

    总结

    Set

    • 是一种叫做集合的数据结构(ES6新增的)
    • 成员唯一、无序且不重复
    • [value, value],键值与键名是一致的(或者说只有键值,没有键名)
    • 允许储存任何类型的唯一值,无论是原始值或者是对象引用
    • 可以遍历,方法有:adddeletehasclear

    WeakSet

    • 成员都是对象
    • 成员都是弱引用,可以被垃圾回收机制回收,可以用来保存 DOM 节点,不容易造成内存泄漏
    • 不能遍历,方法有 adddeletehas

    Map

    • 是一种类似于字典的数据结构,本质上是键值对的集合
    • 可以遍历,可以跟各种数据格式转换
    • 操作方法有:setgethasdeleteclear

    WeakMap

    • 只接受对象作为键名(null 除外),不接受其他类型的值作为键名
    • 键名是弱引用,键值可以是任意的,键名所指向的对象可以被垃圾回收,此时键名是无效的
    • 不能遍历,方法有 getsethasdelete

    推荐教程:《JS教程

    以上是帶你了解ES6的Set,WeakSet,Map和WeakMap的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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

    熱AI工具

    Undresser.AI Undress

    Undresser.AI Undress

    人工智慧驅動的應用程序,用於創建逼真的裸體照片

    AI Clothes Remover

    AI Clothes Remover

    用於從照片中去除衣服的線上人工智慧工具。

    Undress AI Tool

    Undress AI Tool

    免費脫衣圖片

    Clothoff.io

    Clothoff.io

    AI脫衣器

    Video Face Swap

    Video Face Swap

    使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

    熱工具

    記事本++7.3.1

    記事本++7.3.1

    好用且免費的程式碼編輯器

    SublimeText3漢化版

    SublimeText3漢化版

    中文版,非常好用

    禪工作室 13.0.1

    禪工作室 13.0.1

    強大的PHP整合開發環境

    Dreamweaver CS6

    Dreamweaver CS6

    視覺化網頁開發工具

    SublimeText3 Mac版

    SublimeText3 Mac版

    神級程式碼編輯軟體(SublimeText3)

    WebSocket與JavaScript:實現即時監控系統的關鍵技術 WebSocket與JavaScript:實現即時監控系統的關鍵技術 Dec 17, 2023 pm 05:30 PM

    WebSocket與JavaScript:實現即時監控系統的關鍵技術引言:隨著互聯網技術的快速發展,即時監控系統在各個領域中得到了廣泛的應用。而實現即時監控的關鍵技術之一就是WebSocket與JavaScript的結合使用。本文將介紹WebSocket與JavaScript在即時監控系統中的應用,並給出程式碼範例,詳細解釋其實作原理。一、WebSocket技

    PHP與Vue:完美搭檔的前端開發利器 PHP與Vue:完美搭檔的前端開發利器 Mar 16, 2024 pm 12:09 PM

    PHP與Vue:完美搭檔的前端開發利器在當今網路快速發展的時代,前端開發變得愈發重要。隨著使用者對網站和應用的體驗要求越來越高,前端開發人員需要使用更有效率和靈活的工具來創建響應式和互動式的介面。 PHP和Vue.js作為前端開發領域的兩個重要技術,搭配起來可以稱得上是完美的利器。本文將探討PHP和Vue的結合,以及詳細的程式碼範例,幫助讀者更好地理解和應用這兩

    JavaScript與WebSocket:打造高效率的即時天氣預報系統 JavaScript與WebSocket:打造高效率的即時天氣預報系統 Dec 17, 2023 pm 05:13 PM

    JavaScript和WebSocket:打造高效的即時天氣預報系統引言:如今,天氣預報的準確性對於日常生活以及決策制定具有重要意義。隨著技術的發展,我們可以透過即時獲取天氣數據來提供更準確可靠的天氣預報。在本文中,我們將學習如何使用JavaScript和WebSocket技術,來建立一個高效的即時天氣預報系統。本文將透過具體的程式碼範例來展示實現的過程。 We

    簡易JavaScript教學:取得HTTP狀態碼的方法 簡易JavaScript教學:取得HTTP狀態碼的方法 Jan 05, 2024 pm 06:08 PM

    JavaScript教學:如何取得HTTP狀態碼,需要具體程式碼範例前言:在Web開發中,經常會涉及到與伺服器進行資料互動的場景。在與伺服器進行通訊時,我們經常需要取得傳回的HTTP狀態碼來判斷操作是否成功,並根據不同的狀態碼來進行對應的處理。本篇文章將教你如何使用JavaScript來取得HTTP狀態碼,並提供一些實用的程式碼範例。使用XMLHttpRequest

    Django是前端還是後端?一探究竟! Django是前端還是後端?一探究竟! Jan 19, 2024 am 08:37 AM

    Django是一個由Python編寫的web應用框架,它強調快速開發和乾淨方法。儘管Django是web框架,但要回答Django是前端還是後端這個問題,需要深入理解前後端的概念。前端是指使用者直接和互動的介面,後端是指伺服器端的程序,他們透過HTTP協定進行資料的互動。在前端和後端分離的情況下,前後端程式可以獨立開發,分別實現業務邏輯和互動效果,資料的交

    前端面試官常問的問題 前端面試官常問的問題 Mar 19, 2024 pm 02:24 PM

    在前端開發面試中,常見問題涵蓋廣泛,包括HTML/CSS基礎、JavaScript基礎、框架和函式庫、專案經驗、演算法和資料結構、效能最佳化、跨域請求、前端工程化、設計模式以及新技術和趨勢。面試官的問題旨在評估候選人的技術技能、專案經驗以及對行業趨勢的理解。因此,應試者應充分準備這些方面,以展現自己的能力和專業知識。

    Go語言前端技術探秘:前端開發新視野 Go語言前端技術探秘:前端開發新視野 Mar 28, 2024 pm 01:06 PM

    Go語言作為一種快速、高效的程式語言,在後端開發領域廣受歡迎。然而,很少有人將Go語言與前端開發聯繫起來。事實上,使用Go語言進行前端開發不僅可以提高效率,還能為開發者帶來全新的視野。本文將探討使用Go語言進行前端開發的可能性,並提供具體的程式碼範例,幫助讀者更了解這一領域。在傳統的前端開發中,通常會使用JavaScript、HTML和CSS來建立使用者介面

    Django:前端和後端開發都能搞定的神奇框架! Django:前端和後端開發都能搞定的神奇框架! Jan 19, 2024 am 08:52 AM

    Django:前端和後端開發都能搞定的神奇框架! Django是一個高效、可擴展的網路應用程式框架。它能夠支援多種Web開發模式,包括MVC和MTV,可以輕鬆地開發出高品質的Web應用程式。 Django不僅支援後端開發,還能夠快速建構出前端的介面,透過模板語言,實現靈活的視圖展示。 Django把前端開發和後端開發融合成了一種無縫的整合,讓開發人員不必專門學習

    See all articles