ES6中的新資料型別和資料結構

2021-10-10 17:27:55 字數 4736 閱讀 1214

本來有六種(number、string、object、undefined、null、boolean)

一種新的原始資料型別(就是有七種了)

symbol可以通過其英文含義標誌、象徵來理解,標誌、象徵是獨一無二的。所以symbol的第乙個特徵是,兩個symbol物件之間永遠是不等的。symbol可以認為是一種不會相等的字串

定義symbol輸出

這裡要注意,symbol和number、string、object不一樣,他是沒有包裝型別(boolean,number,string包裝型別的作用就是可以使用方法,所以他的生命週期就是呼叫方法(比如說型別轉換啥的)的那一瞬間。)的,加new是會報錯的

let s1 =

symbol()

let s2 =

symbol

('a111'

)

分別會輸出symbol()和symbol(a111)(字串注意要加』』)

如果引數是個物件,就會先把物件進行obj.tostring()然後再傳進去。

symbol.for()

使用symbol.for()定義的與之間定義的不同,使用symbol.for()定義是全域性的**(不管當前環境如何)**,如果再定義乙個一樣的,就會先找之前有沒有一樣的,如果有就會直接拿過來用

let s1 = symbol.

for(

'foo');

let s2 = symbol.

for(

'foo');

s1 === s2 結果是true,因為s2就是把s1的那個直接拿來用了。

symbol.keyfor()會把全域性登記的symbol(就是用symbol.for()定義的)括號中的內容輸出出來。

下例中的sk的value是aaa。

let s = symbol.

for(

'aaa');

let sk = symbol.

keyfor

(s);

symbol的使用場景1.可以當key,比如兩個人名字相同,如果用名字當key後面的就會把前面的覆蓋掉,這個時候用symbol(名字)就沒事了。

下面只會輸出22的leon

const name1 =

'leon'

;const name2 =

'leon'

;const table =

,[name2]

:}

用symbol兩個就都出來了

const name1 =

symbol

('leon');

const name2 =

symbol

('leon');

const table =

,[name2]

:}

2.保護屬性

這裡再例舉遍歷物件屬性的方法for in、for of object.keys、for of object.getownpropertysymbols()(和object.getownpropertynames()相反)。前兩種只能遍歷普通屬性,第三種只能遍歷symbol屬性。

for of reflect.ownkeys()兩種都可以遍歷。

3.可以消除魔術字串

魔術字串就是重複出現的字串。

什麼意思呢?

打個比方兩個屬性,如果我們並不在意裡面的內容,我們之間把內容換成symbol()就行了。

let a =

改為

let a =

一種新的資料結構,裡面的數值都是唯一的(雜湊表?和雜湊表又不一樣,set也有key也有value但是key和value一樣,像是一種特殊的陣列)。

方法:

新增用**add()方法

刪除用delete()**方法

括號中的引數都是內容

**clear()**方法清空

**has()**方法判斷有沒有該元素

s.size注意用的是size不是length

陣列能用的遍歷set也能用

set的應用場景

1.去重

獲得的會是乙個去重之後的結果。

let arr =[1

,2,3

,3,4

,5];

let s =

newset

(arr)

;

可以這麼快去重,那麼力扣上刷題不是就特別投機了嗎?其實單單這樣肯定是過不了的,因為set畢竟只是個偽陣列。

得將其變成乙個真正的陣列,可以用之前介紹過的array.from方法,也可以用[…set]。

2.合併去重

let arr1 =[1

,2,3

,4]let arr2 =[2

,3,4

,5,6

]let s =

newset([

...arr1,

...arr2]

)

3.求交集可以通過set中的has方法來獲得交集。

這裡需要再次強調的是,只要返回乙個true,那麼filter就會將該元素放入新的陣列中(在之前的陣列遍歷中提過)

let arr1 =[1

,2,3

,6,3

,4,5

,5];

let arr2 =[2

,3,4

,5];

let s1 =

newset

(arr1)

;let s2 =

newset

(arr2)

;let result =

newset

(arr1.

filter

(item => s2.

has(item)))

console.

log(result)

;

4.求差集

很簡單,在交集的前提上取反就好了,然後將兩個結果合併。

weakset

特殊的set內部只能存放物件

因為存放內容是物件,所以就會有乙個問題,delete()方法的引數是乙個物件,前面提到過物件棧和堆的問題。也就是說如果像下面**這樣,刪除是不會成功的。

let ws =

newweakset()

;ws.

add();

ws.delete()

;

要這樣處理才行。

let ws =

newweakset()

;const obj =

; ws.

add(obj)

;ws.

delete

(obj)

;

同理,用has()方法也是。

弱引用

還有一點要注意的是weakset是不能遍歷的。

之前在力扣上刷題,就覺得map和c#裡的dictionary很像,就是一種雜湊表,是一種鍵值對的形式。

map新增內容的方法set(),獲取用的是get(),刪除用的是delete(),也有has()和size屬性(對於物件內容的操作,也要注意上文weakset所提到的內容)。

map.

set(key,value)

;

初始化時新增內容,要用陣列形式每個陣列會是他的成員。

1.注意外面還要加個

2.內部鍵值對中,value後的索引再寫內容不會被顯示。

let newm =

newmap([

[key,value],[

'a',

111]])

;

map.set(key,value)時,如果key已存在,會將原來存在的鍵值對中的value更改。

map的遍歷

有三種可選

let key of map.keys

let value of map.values

let [key,value] of map.entries()

和前面相對應的,也有個weakmap,定義也很像,weakmap的key只能是引用型別。其他和weakset一樣,也不支援遍歷,也是弱引用。

ES6新資料型別 Symbol

我們都知道es5 為我們提供了六種資料型別。分別是 物件 object 數字型別 number 布林型別 boolean 字串型別 string 空型別 null 未定義型別 undefind e6又為我們增加了一種型別 symbol 型別,他表示獨一無二的值。這樣下來js 就有七種資料型別了。一 ...

ES6 資料結構)

一 set 用法 set 對陣列進行轉化 新增重複元素不會生效 應用 去重複功能 轉化過程不會有資料型別的轉換 新增 刪除 判斷是否存在的方法 讀取 遍歷 的幾種方法 二 weakset 與set的區別 1.weakset 的元素只能是物件 2.weakset 的物件是弱應用 不會檢測是否在其他中用...

ES6 資料型別Symbol

1 symbol 定義的屬性,一般方法獲取不到 2 let name symbol 3 let obj 4 name 123 5 name 456 6 獲取symbol元素object.getownpropertysymbols 7object.getownpropertysymbols obj 8...