本來有六種(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...