本文小編為大家詳細(xì)介紹“新增的es6數(shù)據(jù)結(jié)構(gòu)是什么”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“新增的es6數(shù)據(jù)結(jié)構(gòu)是什么”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來(lái)學(xué)習(xí)新知識(shí)吧。
10年積累的網(wǎng)站設(shè)計(jì)制作、成都做網(wǎng)站經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶對(duì)網(wǎng)站的新想法和需求。提供各種問題對(duì)應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先網(wǎng)站設(shè)計(jì)后付款的網(wǎng)站建設(shè)流程,更有普蘭免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
新增結(jié)構(gòu)有:1、Symbol,表示獨(dú)一無(wú)二的值,是一個(gè)函數(shù)結(jié)構(gòu);2、Set,指的是“集合”結(jié)構(gòu),類似數(shù)組,允許存放無(wú)序且不能重復(fù)的數(shù)據(jù);3、WeakSet,類似Set,內(nèi)部數(shù)據(jù)也不能有重復(fù)值;4、Map,指的是“字典”結(jié)構(gòu),可存儲(chǔ)映射關(guān)系。
本教程操作環(huán)境:windows7系統(tǒng)、ECMAScript 6版、Dell G3電腦。
1、Symbol
Symbol
是ES6
中新增的一個(gè)基本數(shù)據(jù)類型之一,它是一個(gè)函數(shù)。每一個(gè)從Symbol
函數(shù)返回的Symbol
值都是獨(dú)一無(wú)二的,symbol
值作為對(duì)象屬性的標(biāo)識(shí)符,也是唯一的用途的。
const s1 = Symbol() const s2 = Symbol() console.log(s1 === s2); // false
symbol作為key
第一種方式,直接在對(duì)象的字面量中添加。
// symbol作為key const obj = { [s1]:'abc', [s2]:'cc', }
第二種方式,通過添加數(shù)組方式添加。
// 需要用數(shù)組方式來(lái)獲取,不能通過點(diǎn)語(yǔ)法,否則會(huì)獲取到字符串key console.log(obj[s1]);
第三種方式,通過對(duì)象中的defineProperty
方法添加。
const s4=Symbol() Object.defineProperty(obj,s4,{ configurable:true, enumerable:true, writable:true, value:'ff' })
通過symbol獲取對(duì)應(yīng)的值
需要用數(shù)組方式來(lái)獲取,不能通過點(diǎn)語(yǔ)法,否則會(huì)獲取到字符串key。
console.log(obj[s1]);
symbol
不能被隱式轉(zhuǎn)換成string
類型。
注意:Symbol函數(shù)中的參數(shù)是symbol描述符,這是在ES10新增的特性
let Sym = Symbol("Sym") alert(Sym) // TypeError: Cannot convert a Symbol value to a string
我們不能直接alert
一個(gè)symbol
對(duì)象,但是我們可以通過toString
的方式或者.description
來(lái)獲取symbol
對(duì)象的描述符。
let sym = Symbol('a') console.log(sym.description); // 'a'
遍歷symbol
在使用for
遍歷、object.keys
中是獲取不到symbol
健的,對(duì)此object
還提供了getOwnPropertySymbols
方法,用于獲取對(duì)象中所有symbol的key。
const sKeys=(Object.getOwnPropertySymbols(obj)); for(const skey of sKeys){ console.log(obj[skey]); }
全局symbol對(duì)象注冊(cè)
有時(shí),我們可能需要多個(gè)symbol
的值是一致的,我們可以通過symbol
提供的靜態(tài)方法for
方法傳入一樣的描述符來(lái)使它們的值一致。
Symbol.for
該方法會(huì)在使用給定鍵搜索運(yùn)行時(shí)符號(hào)注冊(cè)表中的現(xiàn)有符號(hào),并在找到時(shí)返回它。否則,使用此鍵在全局符號(hào)注冊(cè)表中創(chuàng)建一個(gè)新符號(hào)。
const sa=Symbol.for('cc') const sb=Symbol.for('cc') console.log(sa===sb); //true
Symbol.keyFor
該方法用于獲取全局symbol
的描述符。
const key =Symbol.keyFor(sb) console.log(key); // c
2、Set
Set
對(duì)象(類似數(shù)組)允許你存放任何數(shù)據(jù)類型,但里面的值不能重復(fù)。
const s1 = new Set() s1.add(10) s1.add(20) s1.add(30) s1.add(40) console.log(s1) // Set(4) { 10, 20, 30, 40 } s1.add(20) console.log(s1) // Set(4) { 10, 20, 30, 40 }
Set常用方法
方法 | 返回值 | 說(shuō)明 |
---|---|---|
size | set 對(duì)象中的數(shù)量 | 返回set對(duì)象中的數(shù)量 |
add | Set 對(duì)象 | 添加元素 |
delete | boolean | 刪除元素 |
has | boolean | Set 對(duì)象中是否存在這個(gè)值 |
clear | 無(wú) | 清空Set 對(duì)象中的值 |
3、WeakSet
WeakSet
是類似Set
的另外一種數(shù)據(jù)結(jié)構(gòu),內(nèi)部數(shù)據(jù)也不能有重復(fù)值。
它與Set
的區(qū)別
WeakSet
只能存放對(duì)象類型,不能存放基本數(shù)據(jù)類型
WeakSet
對(duì)元素是弱引用
基本使用
const weakSet = new WeakSet(); let obj = { name: "_island" }; weakSet.add(obj);
WeakSet常用方法
方法 | 返回值 | 說(shuō)明 |
---|---|---|
add | weakset 對(duì)象 | 添加元素 |
delete | boolean | 刪除元素 |
has | boolean | weakset 對(duì)象中是否存在這個(gè)值 |
關(guān)于遍歷
WeakSet
不能被遍歷,因?yàn)樗皇菍?duì)對(duì)象進(jìn)行弱引用,如果遍歷去獲取元素,有可能導(dǎo)致對(duì)象不能被GC
回收。
所以WeakSet
中的對(duì)象是不能獲取的
4、Map
ES6
新增的數(shù)據(jù)結(jié)構(gòu),用于存儲(chǔ)映射關(guān)系。我們知道在JavaScript
中對(duì)象中是不能用對(duì)象來(lái)作為key
的。(假如我們把對(duì)象作為key
,其內(nèi)部會(huì)將對(duì)象轉(zhuǎn)換為字符串[object object]
)
const obj1 = { name: "_island" }; const obj2 = { name: "QC2125" }; const obj3={ [obj1]:'a', [obj2]:'b', } console.log(obj3); // { '[object Object]': 'b' }
而Map
則可以把對(duì)象作為key
進(jìn)行存儲(chǔ),可以通過set
方法添加到Map
中,也直接通過字面量的方式添加。
const obj1 = { name: "_island" }; const obj2 = { name: "QC2125" }; const map = new Map(); map.set(obj1, "a"); map.set(obj2, "b"); console.log(map); // Map(2) { { name: '_island' } => 'a', { name: 'QC2125' } => 'b' } // or const map2 = new Map([[obj1,'a'],[obj2,'b']])
Map常用方法
方法 | 返回值 | 說(shuō)明 |
---|---|---|
get | 獲取對(duì)應(yīng)的元素 | 通過key 獲取對(duì)應(yīng)元素 |
size | Map 對(duì)象中的數(shù)量 | 返回Map 對(duì)象中的數(shù)量 |
set | Map 對(duì)象 | 添加元素 |
delete | boolean | 刪除元素 |
has | boolean | Set 對(duì)象中是否存在這個(gè)值 |
clear | 無(wú) | 清空Set 對(duì)象中的值 |
遍歷Map
通過foreach
語(yǔ)句遍歷Map
map2.forEach((item) => console.log(item));
通過for..of
遍歷Map
for ([val, key] of map2) { console.log(`${key}---${val}`); }
5、WeakMap
和Map
類似,也是以鍵值對(duì)的形式存在的
和Map的區(qū)別
WeakMap
的key
只能使用對(duì)象,不接受其他的類型作為key
WeakMap
的key
對(duì)對(duì)象是弱引用
基本使用
const weakMap = new WeakMap(); weakMap.set(obj, "a"); console.log(weakMap.get(obj)); // a
WeakMap常用方法
方法 | 返回值 | 說(shuō)明 |
---|---|---|
get | weakmap 對(duì)象 | 獲取元素 |
delete | boolean | 刪除元素 |
has | boolean | weaksmap 對(duì)象中是否存在這個(gè)值 |
關(guān)于遍歷
和WeakSet
一樣,正因?yàn)樗侨跻茫?code>WeakMap的key
是不可枚舉的,如果key
可枚舉那其列表將會(huì)受GC
影響。
讀到這里,這篇“新增的es6數(shù)據(jù)結(jié)構(gòu)是什么”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識(shí)點(diǎn)還需要大家自己動(dòng)手實(shí)踐使用過才能領(lǐng)會(huì),如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。