日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

es6之数据结构 set,WeakSet,mapWeakMap

發(fā)布時間:2023/12/18 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 es6之数据结构 set,WeakSet,mapWeakMap 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
{let list = new Set();list.add(1);list.add(2);list.add(1);console.log(list); //Set(2)?{1, 2} let arr=[1,2,3,1,2] let list2=new Set(arr); console.log(list2); //Set(3)?{1, 2, 3} }

?

Set

ES6 提供了新的數(shù)據(jù)結(jié)構(gòu) Set。它類似于數(shù)組,但是成員的值都是唯一的,沒有重復(fù)的值。

Set 本身是一個構(gòu)造函數(shù),用來生成 Set 數(shù)據(jù)結(jié)構(gòu)。

{let list = new Set();list.add(5);list.add(7);console.log(list.size); //2 }

Set 函數(shù)可以接受一個數(shù)組作為參數(shù),用來初始化。

{let arr = [1,2,3,4,5];let list = new Set(arr);console.log(list.size); //5 }

Set中重復(fù)的元素不會添加,可以用于去重

?

Set不會轉(zhuǎn)換數(shù)據(jù)類型,數(shù)字就是數(shù)字,字符串就是字符串

{let arr=[1,2,3,1,'2']let list2=new Set(arr);console.log(list2); //Set(4) {1, 2, 3, "2"} }

在 Set 內(nèi)部,兩個NaN是相等。

let set = new Set(); let a = NaN; let b = NaN; set.add(a); set.add(b); set // Set {NaN}

兩個對象總是不相等的。

let set = new Set();set.add({}); set.size // 1 set.add({}); set.size // 2

Set 實例的屬性和方法

Set 實例的方法分為兩大類:操作方法(用于操作數(shù)據(jù))和遍歷方法(用于遍歷成員)。

四個操作方法:

  • add(value):添加某個值,返回 Set 結(jié)構(gòu)本身。
  • delete(value):刪除某個值,返回一個布爾值,表示刪除是否成功。
  • has(value):返回一個布爾值,表示該值是否為Set的成員。
  • clear():清除所有成員,沒有返回值。
{let arr=['add','delete','clear','has'];let list=new Set(arr);console.log(list.has('add')); //trueconsole.log(list.delete('add'),list); //true Set(3){"delete", "clear", "has"}list.clear(); //清空console.log(list); // Set(0){} }

?

forEach()

Set 結(jié)構(gòu)的實例與數(shù)組一樣,也擁有forEach方法,用于對每個成員執(zhí)行某種操作,沒有返回值。

{let arr=['add','delete','clear','has'];let list=new Set(arr);for(let key of list.keys()){console.log(key); // add delete clear has }for(let value of list.values()){console.log(value); // add delete clear has } for(let [key,value] of list.entries()){console.log(key,value);// add add delete delete clear clear has has }list.forEach(function(item){console.log(item);})// add delete clear has }

Set 結(jié)構(gòu)的實例默認可遍歷,它的默認遍歷器生成函數(shù)就是它的values方法。

這意味著,可以省略values方法,直接用for...of循環(huán)遍歷 Set。

{ let set = new Set(['red', 'green', 'blue']);for (let x of set) {console.log(x); } // red // green // blue

WeakSet

WeakSet 的成員只能是對象,而不能是其他類型的值。

{let weakList=new WeakSet();let arg={};weakList.add(arg);console.log(weakList); //{{}} } const ws = new WeakSet(); ws.add(1) // TypeError: Invalid value used in weak set ws.add(Symbol()) // TypeError: invalid value used in weak set

WeakSet 可以接受一個數(shù)組或類似數(shù)組的對象作為參數(shù)。

{const a = [[1, 2], [3, 4]]; const ws = new WeakSet(a); console.log(ws)} //WeakSet {Array(2), Array(2)} //__proto__:WeakSet //[[Entries]]:Array(2) //0:Array(2) //value:(2) [3, 4] //1:Array(2) //value:(2) [1, 2] //length:2

注意,是a數(shù)組的成員成為 WeakSet 的成員,而不是a數(shù)組本身。這意味著,數(shù)組的成員只能是對象。

{ const b = [3, 4]; const ws = new WeakSet(b); // Uncaught TypeError: Invalid value used in weak set(…) }

WeakSet 結(jié)構(gòu)有以下三個方法。

  • add(value):添加某個值,返回 WeakSet結(jié)構(gòu)本身。
  • delete(value):刪除某個值,返回一個布爾值,表示刪除是否成功。
  • has(value):返回一個布爾值,表示該值是否為WeakSet的成員。
const ws = new WeakSet(); const obj = {}; const foo = {};ws.add(window); ws.add(obj);ws.has(window); // true ws.has(foo); // false ws.delete(window); ws.has(window); // false

WeakSet 沒有size屬性,沒有辦法遍歷它的成員。

ws.size // undefined ws.forEach // undefined

Map

JavaScript 的對象(Object),本質(zhì)上是鍵值對的集合(Hash 結(jié)構(gòu)),但是傳統(tǒng)上只能用字符串當作鍵。這給它的使用帶來了很大的限制.

ES6 提供了 Map 數(shù)據(jù)結(jié)構(gòu)。它類似于對象,也是鍵值對的集合,但是“鍵”的范圍不限于字符串,各種類型的值(包括對象)都可以當作鍵。也就是說,Object 結(jié)構(gòu)提供了“字符串—值”的對應(yīng),Map 結(jié)構(gòu)提供了“值—值”的對應(yīng),是一種更完善的 Hash 結(jié)構(gòu)實現(xiàn)。如果你需要“鍵值對”的數(shù)據(jù)結(jié)構(gòu),Map 比 Object 更合適。

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

Map 也可以接受一個數(shù)組作為參數(shù)。該數(shù)組的成員是一個個表示鍵值對的數(shù)組。

const map = new Map([['name', '張三'],['title', 'Author'] ]);map.size // 2 map.has('name') // true map.get('name') // "張三" map.has('title') // true map.get('title') // "Author"

如果對同一個鍵多次賦值,后面的值將覆蓋前面的值。

const map = new Map(); map .set(1, 'aaa') .set(1, 'bbb'); map.get(1) // "bbb"

實例的屬性和操作方法

(1)size 屬性

(2)set(key, value)

(3)get(key)

(4)has(key)

(5)delete(key)

(6)clear()

?

{let map = new Map(); map.set('foo', 11); map.set('bar', 22); map.size ;// 2 map.get('foo');//t1 map.has('boo'); //true map.delete('foo'); //true map.clear(); map.size // 0 }

遍歷方法

Map 結(jié)構(gòu)原生提供三個遍歷器生成函數(shù)和一個遍歷方法。

  • keys():返回鍵名的遍歷器。
  • values():返回鍵值的遍歷器。
  • entries():返回所有成員的遍歷器。
  • forEach():遍歷 Map 的所有成員。

Map 結(jié)構(gòu)的默認遍歷器接口(Symbol.iterator屬性),就是entries方法。

WeakMap

WeakMap結(jié)構(gòu)與Map結(jié)構(gòu)類似,也是用于生成鍵值對的集合。

WeakMap與Map的區(qū)別有兩點。

首先,WeakMap只接受對象作為鍵名(null除外),不接受其他類型的值作為鍵名。

其次,WeakMap的鍵名所指向的對象,不計入垃圾回收機制。

// WeakMap 可以使用 set 方法添加成員 const wm1 = new WeakMap(); const key = {foo: 1}; wm1.set(key, 2); wm1.get(key) // 2// WeakMap 也可以接受一個數(shù)組, // 作為構(gòu)造函數(shù)的參數(shù) const k1 = [1, 2, 3]; const k2 = [4, 5, 6]; const wm2 = new WeakMap([[k1, 'foo'], [k2, 'bar']]); wm2.get(k2) // "bar"

WeakMap 的語法

WeakMap 與 Map 在 API 上的區(qū)別主要是兩個,

一是沒有遍歷操作(即沒有keys()、values()和entries()方法),也沒有size屬性。

二是無法清空,即不支持clear方法。因此,WeakMap只有四個方法可用:get()、set()、has()、delete()。

?

轉(zhuǎn)載于:https://www.cnblogs.com/sunmarvell/p/9132682.html

總結(jié)

以上是生活随笔為你收集整理的es6之数据结构 set,WeakSet,mapWeakMap的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。