es6之數據結構 set,WeakSet,mapWeakMap

{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 提供了新的數據結構 Set。它類似于數組,但是成員的值都是唯一的,沒有重復的值。

Set 本身是一個構造函數,用來生成 Set 數據結構。

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

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

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

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

?

Set不會轉換數據類型,數字就是數字,字符串就是字符串

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

在 Set 內部,兩個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 實例的方法分為兩大類:操作方法(用于操作數據)和遍歷方法(用于遍歷成員)。

四個操作方法:

  • add(value):添加某個值,返回 Set 結構本身。
  • 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 結構的實例與數組一樣,也擁有forEach方法,用于對每個成員執行某種操作,沒有返回值。

{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 結構的實例默認可遍歷,它的默認遍歷器生成函數就是它的values方法。

這意味著,可以省略values方法,直接用for...of循環遍歷 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 可以接受一個數組或類似數組的對象作為參數。

{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數組的成員成為 WeakSet 的成員,而不是a數組本身。這意味著,數組的成員只能是對象。

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

WeakSet 結構有以下三個方法。

  • add(value):添加某個值,返回 WeakSet結構本身。
  • 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),本質上是鍵值對的集合(Hash 結構),但是傳統上只能用字符串當作鍵。這給它的使用帶來了很大的限制.

ES6 提供了 Map 數據結構。它類似于對象,也是鍵值對的集合,但是“鍵”的范圍不限于字符串,各種類型的值(包括對象)都可以當作鍵。也就是說,Object 結構提供了“字符串—值”的對應,Map 結構提供了“值—值”的對應,是一種更完善的 Hash 結構實現。如果你需要“鍵值對”的數據結構,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 也可以接受一個數組作為參數。該數組的成員是一個個表示鍵值對的數組。

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 結構原生提供三個遍歷器生成函數和一個遍歷方法。

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

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

WeakMap

WeakMap結構與Map結構類似,也是用于生成鍵值對的集合。

WeakMapMap的區別有兩點。

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

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

// WeakMap 可以使用 set 方法添加成員
const wm1 = new WeakMap();
const key = {foo: 1};
wm1.set(key, 2);
wm1.get(key) // 2// WeakMap 也可以接受一個數組,
// 作為構造函數的參數
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 上的區別主要是兩個,

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

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

?

轉載于:https://www.cnblogs.com/sunmarvell/p/9132682.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/452410.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/452410.shtml
英文地址,請注明出處:http://en.pswp.cn/news/452410.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

關于C語言中繼承和多態的實現

以下的內容綜合了多篇文章,加上一點自己的理解而成。目的為了給自己閱讀他們文章后做一個筆記。在末尾給出了這些文章的地址。 多態的實現可以采用以下幾種方式: (1)使用 vod * (萬能指針)來實現“編譯時多態”。 (2)使用函數指針來實現“運行時…

邊界測試

邊界條件邊界測試是單元測試中最后的也可能是最重要的任務。 軟件常常在它的邊界上失效,例如,處理n元數組的第n個元素時,或做到i次循環中的第i次重復時,往往會發生錯誤。 使用剛好小于、剛好等于和剛好大于最大值或最小值的數據結…

阿里云上Kubernetes集群聯邦

摘要: kubernetes集群讓您能夠方便的部署管理運維容器化的應用。但是實際情況中經常遇到的一些問題,就是單個集群通常無法跨單個云廠商的多個Region,更不用說支持跨跨域不同的云廠商。這樣會給企業帶來一些擔憂,如何應對可用區級別…

缺氧游戲計算機,缺氧PC最低什么配置一覽 你覺得高嗎

缺氧PC最低什么配置一覽,你覺得高嗎。游戲對于電腦有不同程度的要求,缺氧這款游戲也有著自己的配置要求,看看下面的缺氧PC最低什么配置一覽,你的硬件夠得上嗎。缺氧最低配置:首先公布的是官 方配置需求,目前…

Diango博客--14.使用 Django 項目中的 ORM 編寫偽造測試數據腳本

文章目錄0.思路引導1.腳本目錄結構2.使用 Faker 快速生成測試數據3.批量生成測試數據4.執行腳本5.效果展示0.思路引導 1)為了防止博客首頁展示的文章過多以及提升加載速度,可以對文章列表進行分頁展示。 2)不過這需要比較多的文章才能達到分…

基于Sql Server 2008的分布式數據庫的實踐

配置Sql Server 2008(Win7) 1.打開SQL server2012,使用windows身份登錄 2.登錄后,右鍵選擇“屬性”。左側選擇“安全性”,選中右側的“SQL Server 和 Windows 身份驗證模式”以啟用混合登錄模式 3.選擇“連接”&#x…

橫向技術分析C#、C++和Java優劣

本文將從技術人員的角度橫向分析C#、C和Java優劣,其實選擇Java陣營還是.NET陣營,大家可以根據自己的實際需要來確定。 C#誕生之日起,關于C#與Java之間的論戰便此起彼伏,至今不輟。拋卻Microsoft與Sun之間的恩怨與口角,…

軟件測試中的存根程序

存根程序用來代替被測試的模塊所調用的模塊,因此存根程序也稱為“虛擬子程序”,它利用被它代替的模塊的接口,只做盡可能少的數據操作。

計算機網絡應用云計算,計算機網絡云計算的類型

原標題:計算機網絡云計算的類型隨著現代計算機網絡技術的不斷發展,越來越多的與計算機網絡有關的現代化技術得以出現,并且有著廣泛的應用,其中云計算技術就是比較常見的一種,在實際應用中發揮著較高的價值。在信息時代…

sublime_text快捷鍵

1、注釋:選中文本后,CTRL / 2、CTRL N,CTRLS,保存成.html文件后,只需要輸入感嘆號!,然后tab鍵,即可打印出基本的html格式!轉載于:https://www.cnblogs.com/JAVA-STUDYER/p/855040…

Diango博客--15.通過 Django Pagination 實現簡單分頁(一)

文章目錄0.思路引導1.Paginator 類的常用方法2.用 Paginator 給文章列表分頁3.在模板中設置分頁導航4.效果展示0.思路引導 1)當博客上發布的文章越來越多時,通常需要進行分頁顯示,以免所有的文章都堆積在一個頁面,影響用戶體驗。…

SpringMVC 測試 mockMVC

SpringMVC測試框架 基于RESTful風格的SpringMVC的測試,我們可以測試完整的Spring MVC流程,即從URL請求到控制器處理,再到視圖渲染都可以測試。 一 MockMvcBuilder MockMvcBuilder是用來構造MockMvc的構造器,其主要有兩個實現&…

自頂向下和自底向上測試的優缺點

自頂向下測試方法的主要優點是不需要測試驅動程序,能夠在測試階段的早期實現并驗證系統的主要功能,而且能在早期發現上層模塊的接口錯誤。 自頂向下測試方法的主要缺點是需要存根程序,可能遇到與此相聯系的測試困難,低層關鍵模塊中…

C++ class中的靜態(static)成員

C class中的靜態(static)成員 (1) 靜態數據成員 ①一般地靜態數據成員在該類定義之外被初始化,如同一個成員函數被定義在類定義之外一樣。在這種定義中的靜態成員的名字必須被其類名限定修飾,例如下面是_interestRate的初始…

用計算機彈可惜不是你,可惜不是你 還是幸虧不是你

一、 你沒有再挽留 我也沒有再回頭 就這樣 無風無雨也無晴 無疾而終二、 是我孤陋寡聞不知你心有人三、 如果作業有葬禮,全體學生定當盛裝出席.四、 縱使我有千般好 你也看不到 因為你沒有一雙愛我的眼睛五、 原來暫時共你沒緣分 來年先會變得更合襯六、 真的別回頭 你有未來 你…

PHP 完整實戰23種設計模式

PHP實戰創建型模式 單例模式 工廠模式 抽象工廠模式 原型模式 建造者模式 PHP實戰結構型模式 橋接模式 享元模式 外觀模式 適配器模式 裝飾器模式 組合模式 代理模式 過濾器模式 PHP實戰行為型模式 模板模式 策略模式 狀態模式 觀察者模式 責任鏈模式 訪問者模…

Diango博客--16.穩定易用的 Django 分頁庫,完善分頁功能(二)

文章目錄0.思路引導1.分頁效果概述2.分頁思路3.Django 第三方拓展:django-pure-pagination4.自定義模板0.思路引導 1)在前面我們通過 Django Pagination 實現簡單分頁 中,我們實現了一個簡單的分頁導航。但效果有點差強人意,我們…

回歸測試

在集成測試過程中,每當一個新模塊結合進來時,程序就發生了變化:建立了新的數據流路徑,可能出現了新的I/O操作,激活了新的控制邏輯。在集成測試的范疇中,回歸測試是指重新執行已經做過的測試的某個子集&…

不同的寫法 其中 1 2 (試了下 沒有效果 ,先記載這里把)

轉載于:https://www.cnblogs.com/kaibindirver/p/9145455.html

美國西北大學 計算機工程專業排名,[轉載]美國西北大學計算機工程研究生最新專業排名...

對于打算去美國西北大學讀研究生的學生來講,美國西北大學研究生申請要求及美國西北大學研究生專業介紹是學生最關心的問題。本文香港介紹美國西北大學研究生申請要求及美國西北大學研究生的專業介紹,幫助更多的學生更好的了解美國西北大學。2016年西北大…