摘要:類似于數(shù)組,但是中不存在重復(fù)元素??梢越邮芤粋€(gè)數(shù)組或者其他具有接口的數(shù)據(jù)結(jié)構(gòu)作為參數(shù)從上面的代碼可以看出有去重的功能。去重還有另一個(gè)方法將數(shù)據(jù)結(jié)構(gòu)的數(shù)據(jù)轉(zhuǎn)換成數(shù)組。清除實(shí)例的指定成員。返回一個(gè)布爾值,表示某個(gè)值是否在實(shí)例之中。
Set
Set類似于數(shù)組,但是Set中不存在重復(fù)元素。
Set可以接受一個(gè)數(shù)組(或者其他具有itarable接口的數(shù)據(jù)結(jié)構(gòu))作為參數(shù)
const set = new Set([1,1,2,3,4,5,4,5]); console.log([...set]);//[1, 2, 3, 4, 5]
從上面的代碼可以看出Set有去重的功能。[...new Set(arr)]
去重還有另一個(gè)方法,Array.from將Set數(shù)據(jù)結(jié)構(gòu)的數(shù)據(jù)轉(zhuǎn)換成數(shù)組。
function removelArr(arr) { return Array.from(new Set(arr)); } removelArr([1, 1, 2, 3, 2, "1"]);//[1, 2, 3, "1"] 或者 [...new Set([1, 1, 2, 3, 2, "1"])];//[1, 2, 3, "1"]
Set加入值的時(shí)候不會(huì)發(fā)生類型轉(zhuǎn)變
const set = new Set([1,"1"]); console.log([...set]);//[1, "1"]
Set內(nèi)部判斷兩個(gè)值是否相同使用了Object.is(a, b)方法,這個(gè)方法與嚴(yán)格等于的不同之處在于NaN,Object.is(NaN, NaN)返回的是true。
let a = NaN; let b = NaN; let set = new Set(); set.add(a); set.add(a); console.log([...set]);//[NaN]
捎帶提一下兩個(gè)對(duì)象的總是不相等的,這就不用多說了吧,內(nèi)存地址不同。。。
let obj1 = {}; let obj2 = {}; let set = new Set(); set.add(obj1); set.add(obj2); console.log([...set]);//[{}, {}]
Set的屬性
size:獲取成員個(gè)數(shù)
Set的方法
add(value):增加一個(gè)成員,返回值為set結(jié)構(gòu)本身
delete(value):刪除某個(gè)成員,返回值是一個(gè)布爾值,是否刪除成功
clear():清空所有成員,無返回值
has(value):判斷是否有某個(gè)成員,返回一個(gè)布爾值,是否存在某個(gè)元素
let set = new Set(); set.add(1).add(2).add(2).add("1"); set.size;//3 set.delete("1");//true set.size;//2 set.has(2);//true set.clear(); set.size;//0
Set的遍歷操作
keys():返回鍵名的遍歷器
let set = new Set([1, 1, 2, 3, 2, "1"]); //因?yàn)閗eys返回的是遍歷器,所以可以使用`for...of`,數(shù)組沒有鍵名只有鍵值,所以keys和values返回的是一致的 for(let item of set.keys()){ console.log(item);// 1 2 3 "1" }
values():返回值名的遍歷器
let set = new Set([1, 1, 2, 3, 2, "1"]); //因?yàn)関alues返回的是遍歷器,所以可以使用`for...of` for(let item of set.values()){ console.log(item);// 1 2 3 "1" }
entries():返回鍵值對(duì)的遍歷器
//entries方法返回的遍歷器,同時(shí)包括鍵名和鍵值 let set = new Set([1, 1, 2, 3, 2, "1"]); //因?yàn)関alues返回的是遍歷器,所以可以使用`for...of` for(let item of set.entries()){ console.log(item);// [1, 1] [2, 2] [3, 3] ["1", "1"] }
forEach():使用回調(diào)函數(shù)遍歷每個(gè)成員
let set = new Set([1, 4, 9]); set.forEach((value, key) => console.log(key + " : " + value)) // 1 : 1 // 4 : 4 // 9 : 9
Set 結(jié)構(gòu)的實(shí)例默認(rèn)可遍歷,它的默認(rèn)遍歷器生成函數(shù)就是它的values方法。
Set.prototype[Symbol.iterator] === Set.prototype.values //true
這意味著我們可以直接遍歷Set
let set = new Set([1, 4, 9]); for(let item of set) { console.log(item);//1 4 9 }WeakSet
注意點(diǎn):
WeakSet的成員只能是對(duì)象
WeakSet的成員是弱引用,隨時(shí)都可能消失,所以無法遍歷也就無法獲取成員數(shù)量
WeakSet的方法
add(value)向 WeakSet 實(shí)例添加一個(gè)新成員。
delete(value)清除 WeakSet 實(shí)例的指定成員。
has(value)返回一個(gè)布爾值,表示某個(gè)值是否在 WeakSet 實(shí)例之中。
WeakSet 的一個(gè)用處,是儲(chǔ)存 DOM 節(jié)點(diǎn),而不用擔(dān)心這些節(jié)點(diǎn)從文檔移除時(shí),會(huì)引發(fā)內(nèi)存泄漏。
下面是 WeakSet 的另一個(gè)例子。
const foos = new WeakSet() class Foo { constructor() { foos.add(this) } method () { if (!foos.has(this)) { throw new TypeError("Foo.prototype.method 只能在Foo的實(shí)例上調(diào)用!"); } } }
method只能通過Foo的實(shí)例調(diào)用不然就會(huì)拋出異常,當(dāng)刪除實(shí)例的時(shí)候,不用操作foos也不會(huì)引發(fā)內(nèi)存泄露
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/90592.html
摘要:和定義一組鍵值對(duì)的集合它是一組鍵值對(duì)的數(shù)據(jù)結(jié)構(gòu),由于之前的鍵必須是字符串。 Map和Set Map 定義:一組鍵值對(duì)的集合 它是一組鍵值對(duì)的數(shù)據(jù)結(jié)構(gòu),由于之前javascript的鍵(key)必須是字符串。為了使鍵可以是多種類型的于是在最新的es6中引入了map這種數(shù)據(jù)結(jié)構(gòu),這樣可以加快查詢速度,類似于查字典 方法和屬性 var m = map() //空map m.set(學(xué)生年齡,...
摘要:數(shù)組的解構(gòu)賦值規(guī)定允許按照一定模式,從數(shù)組和對(duì)象中提取值對(duì)變量進(jìn)行賦值,我們稱之為解構(gòu)。的規(guī)則是,只要有可能導(dǎo)致解構(gòu)的歧義,就不得使用圓括號(hào)。 數(shù)組的解構(gòu)賦值 ES6規(guī)定:允許按照一定模式,從數(shù)組和對(duì)象中提取值對(duì)變量進(jìn)行賦值,我們稱之為解構(gòu)。以前賦值只能直接指定值 let a = 1; let b = 2; let c = 3; ES6允許以下這種做法 let [a, b, c] = ...
摘要:學(xué)習(xí)之道簡(jiǎn)體中文版通往實(shí)戰(zhàn)大師之旅掌握最簡(jiǎn)單,且最實(shí)用的教程。前言學(xué)習(xí)之道這本書使用路線圖中的精華部分用于傳授,并將其融入一個(gè)獨(dú)具吸引力的真實(shí)世界的具體代碼實(shí)現(xiàn)。完美展現(xiàn)了的優(yōu)雅。膜拜的學(xué)習(xí)之道是必讀的一本書。 《React 學(xué)習(xí)之道》The Road to learn React (簡(jiǎn)體中文版) 通往 React 實(shí)戰(zhàn)大師之旅:掌握 React 最簡(jiǎn)單,且最實(shí)用的教程。 showIm...
摘要:和命令命令是在它所在的代碼塊有效,它屬于塊級(jí)作用域,新增。只有全局作用域和函數(shù)作用域。 let和const命令 let命令是在它所在的代碼塊有效,它屬于塊級(jí)作用域,es6新增。es5只有全局作用域和函數(shù)作用域。let命令存在暫時(shí)性死區(qū)(TDZ),即在申明前使用就會(huì)報(bào)錯(cuò),不存在變量提升 console.log(a); // 報(bào)錯(cuò) let a = 111; ==let不允許在相同作用域中,...
摘要:文中的多為構(gòu)造函數(shù)原型對(duì)象屬性為函數(shù)的專屬屬性,表示函數(shù)的原型對(duì)象。關(guān)于各種數(shù)據(jù)類型的屬性的展示對(duì)象的構(gòu)造器函數(shù)該屬性指向創(chuàng)建該對(duì)象原型的構(gòu)造函數(shù)。對(duì)對(duì)象的凍結(jié)狀態(tài)的設(shè)置和判斷,前者讓凍結(jié)對(duì)象,后者判斷對(duì)象是否被凍結(jié)。 前言 上篇文章介紹了JS的對(duì)象,本文將介紹Object這個(gè)基類,主要介紹其屬性和方法(其實(shí)這些在MDN里都有^_^,點(diǎn)擊這里可以直通MDN)。好了廢話不多說了,直接開始...
閱讀 525·2023-04-26 00:33
閱讀 3549·2021-11-24 09:39
閱讀 2953·2021-09-22 15:34
閱讀 2324·2019-08-23 18:07
閱讀 2921·2019-08-23 18:04
閱讀 3710·2019-08-23 16:06
閱讀 2902·2019-08-23 15:27
閱讀 1620·2019-08-23 14:32