之前在學習ES6 的時候,看到Set
和Map
,不知道其應用場景有哪些,只覺得很多時候會用在數組去重和資料存儲,後來慢慢才領悟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 在儲存判斷唯一性的時候是恆等的,所以不重複
- ##undefined
與
undefined是恆等的,所以不重複
- NaN
與
NaN是不恆等的,但在
Set中認為
NaN與
NaN相等,所有隻能存在一個,不重複。
- size
:傳回集合所包含元素的數量
const items = new Set([1, 2, 3, 4, 5, 5, 5, 5]) items.size // 5Set 實例對象的方法
- 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
方法比
Set的
has方法效率低
- Set
不含重複值(可以利用這個特性實作對一個陣列的去重)
##Set - 經由
delete
方法刪除某個值,而Array
只能透過splice
。兩者的使用方便程度前者比較優 Array - 的許多新方法
map
、filter
、some
、every
等是Set
沒有的(但透過兩者可以互相轉換來使用) Set 的應用
1、
Array.from 方法可以將Set
結構轉為陣列。 <pre class="brush:php;toolbar:false">const items = new Set([1, 2, 3, 4, 5])
const array = Array.from(items)</pre>
2、陣列去重
// 去除数组的重复成员 ;[...new Set(array)] Array.from(new Set(array))
3、陣列的
map 和filter
方法也可以間接用於Set
#<pre class="brush:php;toolbar:false">let set = new Set([1, 2, 3])
set = new Set([...set].map((x) => x * 2))
// 返回Set结构:{2, 4, 6}
let set = new Set([1, 2, 3, 4, 5])
set = new Set([...set].filter((x) => x % 2 == 0))
// 返回Set结构:{2, 4}</pre>
4、實作並集
、交集(Intersect)
和差集<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) => b.has(x)))
// set {2, 3}
// 差集
let difference = new Set([...a].filter((x) => !b.has(x)))
// Set {1}</pre>
weakSet
結構與Set
類似,也是不重複的值的集合。
- add()
- 方法時傳入了非數組和類似數組的對象的參數,就會拋出錯誤。
const b = [1, 2, [1, 2]] new WeakSet(b) // Uncaught TypeError: Invalid value used in weak set
- WeakSet
- 不可迭代,因此不能用在
for-of
等迴圈中。 WeakSet - 沒有
size
屬性。 Map
中儲存的是key-value
形式的鍵值對, 其中的key
和value
可以是任何類型的, 即物件也可以作為key
。 Map
的出現,就是讓各種類型的值都可以當作鍵。 Map
提供的是 “值-值”的對應。 <h4 id="Map-和-Object-的区别">Map 和 Object 的区别</h4>
<ol>
<li>
<code>Object
对象有原型, 也就是说他有默认的 key
值在对象上面, 除非我们使用 Object.create(null)
创建一个没有原型的对象;
Object
对象中, 只能把 String
和 Symbol
作为 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> <span>姓名</span> <span>{{info.name}}</span> </p> <p> <span>年龄</span> <span>{{info.age}}</span> </p> <p> <span>性别</span> <span>{{info.sex}}</span> </p> <p> <span>手机号</span> <span>{{info.phone}}</span> </p> <p> <span>家庭住址</span> <span>{{info.address}}</span> </p> <p> <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> </p> <p> <span>{{label}}</span> <span>{{value}}</span> </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
除外),不接受其他类型的值作为键名 - 键名是弱引用,键值可以是任意的,键名所指向的对象可以被垃圾回收,此时键名是无效的
- 不能遍历,方法有
get
、set
、has
、delete
总结
Set
- 是一种叫做集合的数据结构(ES6新增的)
- 成员唯一、无序且不重复
-
[value, value]
,键值与键名是一致的(或者说只有键值,没有键名) - 允许储存任何类型的唯一值,无论是原始值或者是对象引用
- 可以遍历,方法有:
add
、delete
、has
、clear
WeakSet
- 成员都是对象
- 成员都是弱引用,可以被垃圾回收机制回收,可以用来保存
DOM
节点,不容易造成内存泄漏 - 不能遍历,方法有
add
、delete
、has
Map
- 是一种类似于字典的数据结构,本质上是键值对的集合
- 可以遍历,可以跟各种数据格式转换
- 操作方法有:
set
、get
、has
、delete
、clear
WeakMap
- 只接受对象作为键名(
null
除外),不接受其他类型的值作为键名 - 键名是弱引用,键值可以是任意的,键名所指向的对象可以被垃圾回收,此时键名是无效的
不能遍历,方法有
get
、set
、has
、delete
推荐教程:《JS教程》
以上是帶你了解ES6的Set,WeakSet,Map和WeakMap的詳細內容。更多資訊請關注PHP中文網其他相關文章!

Python和JavaScript的主要區別在於類型系統和應用場景。 1.Python使用動態類型,適合科學計算和數據分析。 2.JavaScript採用弱類型,廣泛用於前端和全棧開發。兩者在異步編程和性能優化上各有優勢,選擇時應根據項目需求決定。

選擇Python還是JavaScript取決於項目類型:1)數據科學和自動化任務選擇Python;2)前端和全棧開發選擇JavaScript。 Python因其在數據處理和自動化方面的強大庫而備受青睞,而JavaScript則因其在網頁交互和全棧開發中的優勢而不可或缺。

Python和JavaScript各有優勢,選擇取決於項目需求和個人偏好。 1.Python易學,語法簡潔,適用於數據科學和後端開發,但執行速度較慢。 2.JavaScript在前端開發中無處不在,異步編程能力強,Node.js使其適用於全棧開發,但語法可能複雜且易出錯。

javascriptisnotbuiltoncorc; sanInterpretedlanguagethatrunsonenginesoftenwritteninc.1)JavascriptwasdesignedAsignedAsalightWeight,drackendedlanguageforwebbrowsers.2)Enginesevolvedfromsimpleterterpretpretpretpretpreterterpretpretpretpretpretpretpretpretpretcompilerers,典型地,替代品。

JavaScript可用於前端和後端開發。前端通過DOM操作增強用戶體驗,後端通過Node.js處理服務器任務。 1.前端示例:改變網頁文本內容。 2.後端示例:創建Node.js服務器。

選擇Python還是JavaScript應基於職業發展、學習曲線和生態系統:1)職業發展:Python適合數據科學和後端開發,JavaScript適合前端和全棧開發。 2)學習曲線:Python語法簡潔,適合初學者;JavaScript語法靈活。 3)生態系統:Python有豐富的科學計算庫,JavaScript有強大的前端框架。

JavaScript框架的強大之處在於簡化開發、提升用戶體驗和應用性能。選擇框架時應考慮:1.項目規模和復雜度,2.團隊經驗,3.生態系統和社區支持。

引言我知道你可能會覺得奇怪,JavaScript、C 和瀏覽器之間到底有什麼關係?它們之間看似毫無關聯,但實際上,它們在現代網絡開發中扮演著非常重要的角色。今天我們就來深入探討一下這三者之間的緊密聯繫。通過這篇文章,你將了解到JavaScript如何在瀏覽器中運行,C 在瀏覽器引擎中的作用,以及它們如何共同推動網頁的渲染和交互。 JavaScript與瀏覽器的關係我們都知道,JavaScript是前端開發的核心語言,它直接在瀏覽器中運行,讓網頁變得生動有趣。你是否曾經想過,為什麼JavaScr


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

記事本++7.3.1
好用且免費的程式碼編輯器

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

禪工作室 13.0.1
強大的PHP整合開發環境