js的Set和Map集合


目錄

1、js的Set介紹

  1. Set是ES6提供的一種類似於數組的數據結構。
  2. 不同於數組的是,它的成員的值都是唯一的,不會有重復。

1-1、Set基礎用法

創建一個名為s的Set數據結構的變量

let s = new Set();

在創建Set 對象的時候,還可以傳遞一個數組(或者具有iterable接口其他數據類型)作為參數,因為Set數據接口不會有重復的值,所以會自動去掉數組中重復的值。

Set去重示例

const log=console.log;
let set = new Set([1,2,2,3,3,4,4]);
let array=[...set];
log(array);

在創建Set 對象的時候, 傳遞給構造函數的初始值是不會發生類型轉換的,所以數字3和字符3是不同的,Set內部判斷兩個值是否相同時使用的算法是“Same-value equality”,它類似精確相等(===),主要區別是NaN等於自身,而精確相同NaN是不等於自身的。

Set參數類型示例

const log=console.log;
let set = new Set([1,2,3,"3",NaN,NaN]);
let array=[...set];
log(array);

1-2、Set對象的操作方法

方法/屬性 功能介紹
size 獲取當前Set對象的長度
add(value) 向當前Set對象中添加一個值,返回的是Set對象,所以支持鏈式寫法
delete(value) 刪除當前Set對象中的一個值,返回一個布爾值,表示是否刪除成功
has(value) 檢測這個value是否是當前Set對象的一個元素,通過返回的布爾值表示
clear() 清除當前Set對象所有元素,沒有返回值

Set對象size屬性示例

const log=console.log;
let set = new Set([1,2,3,4]);
log(set.size);

Set對象add方法示例

const log=console.log;
let set = new Set();
set.add(1).add(2).add(3);
let array=[...set];
log(array);

Set對象delete方法示例

const log=console.log;
let set = new Set([1,2,3,4,5]);
set.delete(5);
let array=[...set];
log(array);

Set對象has方法示例

const log=console.log;
let set = new Set([1,2,3,4,5]);
let isSetValue=set.has(5);
log(isSetValue);

Set對象clear方法示例

const log=console.log;
let set = new Set([1,2,3,4,5]);
set.clear();
let array=[...set];
log(array);

1-3、Set對象的遍歷方法

方法/屬性 功能介紹
keys() 返回該Set對象鍵名的遍歷器
values() 返回該Set對象鍵值的遍歷器
entries() 返回該Set對象鍵值對的遍歷器
forEach() 使用回調函數遍歷該Set對象的每個元素

由於Set對象鍵名和鍵值都是同一個值,所以keys()和values()方法完全一致。

Set對象默認可以遍歷,其默認遍歷器生產函數就是它的values方法,所以可以省略values方法,直接用for...of遍歷。

Set.prototype[Symbol.iterator] === Set.prototype.values
//true

Set對象的keys方法和values方法示例

const log=console.log;
let set = new Set(["你","好","!"]);
for(let i of set.keys()){
    log(i);
}
for(let i of set.values()){
    log(i);
}
for(let i of set){
    log(i);
}

因為entries方法同時包含鍵和值,所以使用entries方法遍歷Set對象的時候返回的是包含鍵值的數組

Set對象的entries方法示例

const log=console.log;
let set = new Set(["你","好","!"]);
for(let i of set.entries()){
    log(i);
}

因為擴展運算符(...)內部使用的for...of循環,所以擴展運算符也可用於Set對象。

Set對象的forEach方法示例

const log = console.log;
let set = new Set(["你", "好", "!"]);
set.forEach((value,key) => {
    log(value,key)
})
log([...set]);

2、js的Set擴展WeakSet篇

WeakSet的概述:

  1. WeakSet數據結構是一種類似於Set的數據結構,因此也不可以重復
  2. WeakSet的成員只能是對象,不能是其他值,並且對象都是弱引用
  3. 因為成員都是對象的弱引用,所以隨時都可能會被垃圾回收,因此是不能遍歷的
  4. WeakSet相對於Set的屬性和方法而言,沒有size, 也沒有clear

3、js的Map介紹

  1. Map數據結構是一種類似於對象的鍵值對數據結構
  2. 不同於對象的是Map的鍵可以為任意類型的值,而不僅僅為字符串

3-1、Map基礎用法

創建一個名為m的Map數據結構的變量

let m = new Map();

在創建Map對象的時候,任何具有Iterator接口且每個成員都是一個雙元數組的數據結構都可以當作Map構造函數的參數。

例如以下:

let log=console.log;
let array=[["姓名", "小王"],["年齡","23"]];
let m = new Map(array);
log(m);

3-2、Map對象的操作方法

方法/屬性 功能介紹
size 獲取當前Map對象的長度
set(key,value) 向當前Map對象中添加一個值,返回的Map對象,所以支持鏈式寫法
get(key) 通過key找到value,如果找不到,返回undefined
delete(key) 刪除當前Map對象中的一個值,返回一個布爾值,表示是否刪除成功
has(key) 檢測這個value是否是當前Map對象的一個元素,通過返回的布爾值表示
clear() 清除當前Map對象所有元素,沒有返回值

Map對象的size屬性

let log=console.log;
let array=[["姓名", "小王"],["年齡","23"]];
let m = new Map(array);
log(m.size);

Map對象的set和get方法

只有對同一對象的引用,Map結構才會將其視為同一個鍵,這一點要非常小心。
let log=console.log;
let m = new Map();
m.set("名字","張三")
.set({},"李四");
log(m);
log(m.get("名字"));
log(m.get({}));

3-3、Map對象的遍歷方法

方法/屬性 功能介紹
keys() 返回該Map對象鍵名的遍歷器
values() 返回該Map對象鍵值的遍歷器
entries() 返回該Map對象鍵值對的遍歷器
forEach() 使用回調函數遍歷該Map對象的每個元素

Map對象的keys和values方法

let log=console.log;
let m = new Map();
m.set("名字","張三")
.set({},"李四")
.set("年齡","23");
for(let key of m.keys()){
    log(key);
}
log("-----------")
for(let value of m.values()){
    log(value);
}

Map對象的entries方法

Map對象默認可以遍歷,其默認遍歷器生產函數就是它的entries方法,所以可以省略entries方法,直接用for...of遍歷。

map[Symbol.iterator] === map.entriies
//true
let log=console.log;
let m = new Map();
m.set("名字","張三")
.set({},"李四")
.set("年齡","23");
for(let [key,value] of m.entries()){
    log(key+"==>"+value);
}
log("-----------");
for(let [key,value] of m.entries()){
    log(key+"==>"+value);
}

Map對象的forEach方法

let log=console.log;
let m = new Map();
m.set("名字","張三")
.set({},"李四")
.set("年齡","23");
m.forEach((value,key,map)=>{
    log("key: %s ==> value: %s",key,value);
})

4、js的Map擴展WeakMap篇

WeakMap的概述:

  1. WeakMap數據結構是一種類似於Map的數據結構,不過鍵名必須為對象(null除外)
  2. 與Map的鍵名不同的是,WeakMap的鍵名都是弱引用。
  3. 因為鍵名都是對象的弱引用,所以隨時都可能會被垃圾回收,因此是不能遍歷的
  4. WeakMap相對於Map的屬性和方法而言,沒有size,也沒有clear


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM