最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

ES6中Set和Map用法實(shí)例詳解

 更新時(shí)間:2020年03月02日 10:44:43   作者:葉落森  
這篇文章主要介紹了ES6中Set和Map用法,結(jié)合實(shí)例形式詳細(xì)分析了ES6中Set和Map的基本功能、原理、使用方法及操作注意事項(xiàng),需要的朋友可以參考下

本文實(shí)例講述了ES6中Set和Map用法。分享給大家供大家參考,具體如下:

Set

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

Set函數(shù)可以接受一個(gè)數(shù)組(或類(lèi)似數(shù)組的對(duì)象)作為參數(shù),用來(lái)初始化。

// 例一
var set = new Set([1, 2, 3, 4, 4]);
[...set]
// [1, 2, 3, 4]
 
var s = new Set();
 
[2, 3, 5, 4, 5, 2, 2].map(x => s.add(x));
 
for (let i of s) {
 console.log(i);
}
// 2 3 5 4

注:在Set內(nèi)部,兩個(gè)NaN是相等。兩個(gè)對(duì)象總是不相等的。可以用length來(lái)檢測(cè)

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
var arr=[
	{id:1,name:'葉落森'},
	{id:2,name:'葉落森'},
	{id:3,name:'葉落森'},
	{id:4,name:'葉落森'},
	{id:2,name:'葉落森'}
]
const s = new Set();
arr.forEach(x => s.add(x));
for (let i of s) {
 console.log(i);
}

 

四個(gè)操作方法:

  • add(value):添加某個(gè)值,返回Set結(jié)構(gòu)本身。
  • delete(value):刪除某個(gè)值,返回一個(gè)布爾值,表示刪除是否成功。
  • has(value):返回一個(gè)布爾值,表示該值是否為Set的成員。
  • clear():清除所有成員,沒(méi)有返回值
let s = new Set();
s.add(1).add(2).add(2);
// 注意2被加入了兩次
s.size // 2
s.has(1) // true
s.has(2) // true
s.has(3) // false
 
console.log(s.delete(2));//true
s.has(2) // false

set內(nèi)部的元素可以遍歷for...of...

遍歷操作

Set 結(jié)構(gòu)的實(shí)例有四個(gè)遍歷方法,可以用于遍歷成員。

  • keys():返回鍵名的遍歷器
  • values():返回鍵值的遍歷器
  • entries():返回鍵值對(duì)的遍歷器
  • forEach():使用回調(diào)函數(shù)遍歷每個(gè)成員

需要特別指出的是,Set的遍歷順序就是插入順序。這個(gè)特性有時(shí)非常有用,比如使用 Set 保存一個(gè)回調(diào)函數(shù)列表,調(diào)用時(shí)就能保證按照添加順序調(diào)用。

(1)keys(),values(),entries()

keys方法、values方法、entries方法返回的都是遍歷器對(duì)象。由于 Set 結(jié)構(gòu)沒(méi)有鍵名,只有鍵值(或者說(shuō)鍵名和鍵值是同一個(gè)值),所以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"]

Set 結(jié)構(gòu)的實(shí)例默認(rèn)可遍歷,它的默認(rèn)遍歷器生成函數(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

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

set = new Set([1, 4, 9]);
set.forEach((value, key) => console.log(key + ' : ' + value))
// 1 : 1
// 4 : 4
// 9 : 9

Map

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

var m = new Map();
var o = {p: "Hello World"};
 
m.set(o, "content")
m.get(o) // "content"
 
m.has(o) // true
m.delete(o) // true
m.has(o) // false

注意,只有對(duì)同一個(gè)對(duì)象的引用,Map結(jié)構(gòu)才將其視為同一個(gè)鍵。這一點(diǎn)要非常小心。

var map = new Map();
map.set(['a'], 555);
map.get(['a']) // undefined

上面代碼的set和get方法,表面是針對(duì)同一個(gè)鍵,但實(shí)際上這是兩個(gè)值,內(nèi)存地址是不一樣的,因此get方法無(wú)法讀取該鍵,返回undefined。

注:如果Map的鍵是一個(gè)簡(jiǎn)單類(lèi)型的值(數(shù)字、字符串、布爾值),則只要兩個(gè)值嚴(yán)格相等,Map將其視為一個(gè)鍵,包括0和-0。另外,雖然NaN不嚴(yán)格相等于自身,但Map將其視為同一個(gè)鍵。

實(shí)例屬性和方法:size、set、get、has、delete、clear

遍歷方法:keys()、values()、entries()、forEach()

const map = new Map([
 ['F', 'no'],
 ['T', 'yes'],
]);
 
for (let key of map.keys()) {
 console.log(key);
}
// "F"
// "T"
 
for (let value of map.values()) {
 console.log(value);
}
// "no"
// "yes"
 
for (let item of map.entries()) {
 console.log(item[0], item[1]);
}
// "F" "no"
// "T" "yes"
 
// 或者
for (let [key, value] of map.entries()) {
 console.log(key, value);
}
// "F" "no"
// "T" "yes"
 
// 等同于使用map.entries()
for (let [key, value] of map) {
 console.log(key, value);
}
// "F" "no"
// "T" "yes"

Map 結(jié)構(gòu)轉(zhuǎn)為數(shù)組結(jié)構(gòu),比較快速的方法是使用擴(kuò)展運(yùn)算符(...)。

const map = new Map([
 [1, 'one'],
 [2, 'two'],
 [3, 'three'],
]);
 
[...map.keys()]
// [1, 2, 3]
 
[...map.values()]
// ['one', 'two', 'three']
 
[...map.entries()]
// [[1,'one'], [2, 'two'], [3, 'three']]
 
[...map]
// [[1,'one'], [2, 'two'], [3, 'three']]

結(jié)合數(shù)組的map方法、filter方法,可以實(shí)現(xiàn) Map 的遍歷和過(guò)濾(Map 本身沒(méi)有mapfilter方法)。

const map0 = new Map()
 .set(1, 'a')
 .set(2, 'b')
 .set(3, 'c');
 
const map1 = new Map(
 [...map0].filter(([k, v]) => k < 3)
);
// 產(chǎn)生 Map 結(jié)構(gòu) {1 => 'a', 2 => 'b'}
 
const map2 = new Map(
 [...map0].map(([k, v]) => [k * 2, '_' + v])
  );
// 產(chǎn)生 Map 結(jié)構(gòu) {2 => '_a', 4 => '_b', 6 => '_c'}

此外,Map 還有一個(gè)forEach方法,與數(shù)組的forEach方法類(lèi)似,也可以實(shí)現(xiàn)遍歷。

map.forEach(function(value, key, map) {
 console.log("Key: %s, Value: %s", key, value);
});

 

區(qū)別:

set是一種關(guān)聯(lián)式容器,其特性如下:

  • set以RBTree作為底層容器
  • 所得元素的只有key沒(méi)有value,value就是key
  • 不允許出現(xiàn)鍵值重復(fù)
  • 所有的元素都會(huì)被自動(dòng)排序
  • 不能通過(guò)迭代器來(lái)改變set的值,因?yàn)閟et的值就是鍵

map和set一樣是關(guān)聯(lián)式容器,它們的底層容器都是紅黑樹(shù),區(qū)別就在于map的值不作為鍵,鍵和值是分開(kāi)的。它的特性如下:

  • map以RBTree作為底層容器
  • 所有元素都是鍵+值存在
  • 不允許鍵重復(fù)
  • 所有元素是通過(guò)鍵進(jìn)行自動(dòng)排序的
  • map的鍵是不能修改的,但是其鍵對(duì)應(yīng)的值是可以修改的

 

weakset

WeakSet結(jié)構(gòu)與Set類(lèi)似,也是不重復(fù)的值的集合。

WeakSet和Set的區(qū)別:

  • WeakSet的成員只能是對(duì)象,而不能是其他類(lèi)型的值
  • WeakSet中的對(duì)象都是弱引用,即垃圾回收機(jī)制不考慮WeakSet對(duì)該對(duì)象的引用,也就是說(shuō),如果其他對(duì)象都不再引用該對(duì)象,那么垃圾回收機(jī)制會(huì)自動(dòng)回收該對(duì)象所占用的內(nèi)存,不考慮該對(duì)象還存在于WeakSet之中。這個(gè)特點(diǎn)意味著,無(wú)法引用WeakSet的成員,因此WeakSet是不可遍歷的。

WeakMap可以參考WeakSet

感興趣的朋友可以使用在線HTML/CSS/JavaScript代碼運(yùn)行工具http://tools.jb51.net/code/HtmlJsRun測(cè)試上述代碼運(yùn)行效果。

更多關(guān)于JavaScript相關(guān)內(nèi)容可查看本站專(zhuān)題:《JavaScript操作DOM技巧總結(jié)》、《JavaScript頁(yè)面元素操作技巧總結(jié)》、《JavaScript事件相關(guān)操作與技巧大全》、《JavaScript查找算法技巧總結(jié)》、《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》、《JavaScript遍歷算法與技巧總結(jié)》及《JavaScript錯(cuò)誤與調(diào)試技巧總結(jié)

希望本文所述對(duì)大家JavaScript程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • 微信小程序純文本實(shí)現(xiàn)@功能

    微信小程序純文本實(shí)現(xiàn)@功能

    這篇文章主要介紹了ZZ需求小程序純文本實(shí)現(xiàn)@功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-04-04
  • 原生js實(shí)現(xiàn)下拉框功能(支持鍵盤(pán)事件)

    原生js實(shí)現(xiàn)下拉框功能(支持鍵盤(pán)事件)

    本文主要分享了原生js實(shí)現(xiàn)下拉框(支持鍵盤(pán)事件)功能的示例代碼。具有一定的參考價(jià)值,下面跟著小編一起來(lái)看下吧
    2017-01-01
  • Express實(shí)現(xiàn)前端后端通信上傳圖片之存儲(chǔ)數(shù)據(jù)庫(kù)(mysql)傻瓜式教程(二)

    Express實(shí)現(xiàn)前端后端通信上傳圖片之存儲(chǔ)數(shù)據(jù)庫(kù)(mysql)傻瓜式教程(二)

    這篇文章主要介紹了Express實(shí)現(xiàn)前端后端通信上傳圖片之存儲(chǔ)數(shù)據(jù)庫(kù)(mysql)傻瓜教程(二)的相關(guān)資料,需要的朋友可以參考下
    2015-12-12
  • 理解Javascript_10_對(duì)象模型

    理解Javascript_10_對(duì)象模型

    什么都不想說(shuō),一段代碼兩張圖,解釋一切。注:在此之前請(qǐng)閱讀前面的系列博文
    2010-10-10
  • JS查找字符串中出現(xiàn)次數(shù)最多的字符

    JS查找字符串中出現(xiàn)次數(shù)最多的字符

    本文給大家?guī)?lái)兩種js中查找字符串中出現(xiàn)次數(shù)最多的字符,在這兩種方法中小編推薦使用第二種,對(duì)js查找字符串出現(xiàn)次數(shù)的相關(guān)知識(shí)感興趣的朋友一起看看吧
    2016-09-09
  • D3.js實(shí)現(xiàn)餅狀圖的方法詳解

    D3.js實(shí)現(xiàn)餅狀圖的方法詳解

    相信大家都知道圖表是數(shù)據(jù)圖形化的表示,通過(guò)形象的圖表來(lái)展示數(shù)據(jù),比如條形圖,折線圖,餅圖等。可視化圖表可以幫助開(kāi)發(fā)者更容易理解復(fù)雜的數(shù)據(jù),提高生產(chǎn)的效率和Web應(yīng)用和項(xiàng)目的可靠性?,F(xiàn)在就讓我們大家一起來(lái)學(xué)習(xí)用D3.js來(lái)實(shí)現(xiàn)餅圖的方法,有需要的可以參考借鑒。
    2016-09-09
  • 如何使用pace.js美化你的網(wǎng)站加載進(jìn)度條詳解

    如何使用pace.js美化你的網(wǎng)站加載進(jìn)度條詳解

    Pace.js是一個(gè)非常有意思的js插件,可以自動(dòng)的監(jiān)聽(tīng)頁(yè)面的加載數(shù)據(jù),并且能夠定制加載條,下面這篇文章主要給大家介紹了關(guān)于使用pace.js如何美化你的網(wǎng)站加載進(jìn)度條的相關(guān)資料,需要的朋友可以參考下
    2022-02-02
  • js 性能優(yōu)化之算法和流程控制

    js 性能優(yōu)化之算法和流程控制

    循環(huán)處理是最常見(jiàn)的編程模式之一,也是提升性能必須關(guān)注的要點(diǎn)之一。本文將對(duì)此進(jìn)行介紹。具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧
    2017-02-02
  • 解決Layui中templet中a的onclick參數(shù)傳遞的問(wèn)題

    解決Layui中templet中a的onclick參數(shù)傳遞的問(wèn)題

    今天小編就為大家分享一篇解決Layui中templet中a的onclick參數(shù)傳遞的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-09-09
  • JavaScript常見(jiàn)事件處理程序?qū)嵗偨Y(jié)

    JavaScript常見(jiàn)事件處理程序?qū)嵗偨Y(jié)

    這篇文章主要介紹了JavaScript常見(jiàn)事件處理程序,結(jié)合實(shí)例形式總結(jié)分析了javascript HTML事件、DOM事件、IE事件等相關(guān)處理程序與操作技巧,需要的朋友可以參考下
    2019-01-01

最新評(píng)論

郯城县| 乡城县| 廉江市| 陇南市| 冀州市| 宁南县| 涞水县| 鄂州市| 榆中县| 拜泉县| 广水市| 盐亭县| 曲麻莱县| 海盐县| 双峰县| 武定县| 梨树县| 松江区| 鹤峰县| 茌平县| 拉萨市| 泾阳县| 和硕县| 通渭县| 镇远县| 洞口县| 西峡县| 高安市| 尚志市| 金塔县| 揭阳市| 惠州市| 鸡东县| 澜沧| 文昌市| 都昌县| 集贤县| 博客| 乐至县| 西丰县| 尼勒克县|