目錄
1、js的Set介紹
- Set是ES6提供的一種類似於數組的數據結構。
- 不同於數組的是,它的成員的值都是唯一的,不會有重復。
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的概述:
- WeakSet數據結構是一種類似於Set的數據結構,因此也不可以重復
- WeakSet的成員只能是對象,不能是其他值,並且對象都是弱引用
- 因為成員都是對象的弱引用,所以隨時都可能會被垃圾回收,因此是不能遍歷的
- WeakSet相對於Set的屬性和方法而言,沒有size, 也沒有clear
3、js的Map介紹
- Map數據結構是一種類似於對象的鍵值對數據結構
- 不同於對象的是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的概述:
- WeakMap數據結構是一種類似於Map的數據結構,不過鍵名必須為對象(null除外)
- 與Map的鍵名不同的是,WeakMap的鍵名都是弱引用。
- 因為鍵名都是對象的弱引用,所以隨時都可能會被垃圾回收,因此是不能遍歷的
- WeakMap相對於Map的屬性和方法而言,沒有size,也沒有clear