一文帶你看懂ES6中的Set,Map,Symbol

2021-10-02 05:36:26 字數 3433 閱讀 4545

隨著2023年的帶來,js基本型別也增加到了7種,bigint這個玩意說起來也挺好理解的,再加上undefined, null, string, number, boolean,相對於引用型別,都是比較好明白的。哎等會,好像少了乙個,symbol這個es6新增的東西到底有啥用呢?

es6前沒有實現集合和字典型別確實產生了一些不便,因此es6中補上了這兩個東西,可是呢由於js物件的特殊性,這兩個在實際開發中也沒有得到太多的應用,雖說是比symbol好一點。

對於還沒接觸工作,各種玩具工作,抄人**的我來說,symbol這玩意我真沒用過。看看它同時代的…,解構賦值,箭頭函式,promise,已經可以說是用到爛了,那麼這個東西到底有什麼用呢?

大家對symbol有著些許了解的人可能知道:

>

let a =

symbol

('1'

)undefined

>

let b =

symbol

('1'

)undefined

> a===b

false

這段**有啥用我也不解釋了,這是我對symbol的唯一印象,甚至當初我學immer的時候第一時間就想到了這個,雖然好像沒啥關係。

symbol,中文常稱為符號,先看幾個重要的特性:

> a

symbol(1

)>

let b = symbol.

for(

'1')

undefined

> b

symbol(1

)> a===b

true

symbol.for是可共享,在建立的時候會檢查全域性是否尋在這個key的symbol.如果存在就直接返回這個symbol,如果不存在就會建立,並且在全域性註冊。

> symbol.

keyfor

(a)'1'

> c =

symbol

('1'

)symbol(1

)> symbol.

keyfor

(c)undefined

keyfor,獲取for建立的共享symbol。別的無法獲取。

下面內容參考自此文

var myobj =

;var foosym =

symbol

('foo');

var othersym =

symbol

('bar');

myobj[

'foo']=

'bar'

;myobj[foosym]

='baz'

;myobj[othersym]

='bing'

;assert

(myobj.foo ===

'bar');

assert

(myobj[foosym]

==='baz');

assert

(myobj[othersym]

==='bing'

);

這個例子還是很好理解的,也就是說symbol都是唯一的,當然除了symbol.for()。因此假定你有乙個日誌庫,該庫包含了多個日誌級別,例如 logger.levels.debug、logger.levels.info、logger.levels.warn 等等。在 es5 中,你通過字串或者整型設定或者判斷級別:logger.levels.debug === 『debug』、logger.levels.debug === 10。這些方式都不是理想方式,因為它們不能保證級別取值唯一,但是symbol可以滿足這個要求。

先寫到這裡,以後使用到了在更新例子吧

集合在python中早就存在了,當時做題的時候覺得有個這麼個玩意是真的方便,所以開始轉前端時,js中這個還要new的東西讓我覺得是真的麻煩,後來開發過程中對於集合的需要並沒有那麼迫切,也就漸漸忘記了。這次刷題,忽然發現原來集合的方法還挺多,而且還是有一些坑的。

let req =

newset([

12,2,

3])req.

foreach

((item,index,ss)

=> console.

log(item, index,ss)

)sentry-

5.7.1

.min.js:212

12set(3

)sentry-

5.7.1

.min.js:22

2set(3

)sentry-

5.7.1

.min.js:23

3set(3

)

map是沒有辦法遍歷集合型別的,foreach則可以,有趣的是foreach的傳值,key,value是相等的,這個我們可以理解,但是沒有索引,同時第三個值代表了集合本身就有些不知所云了。

同時我們要知道的是set中的子項是通過object.is進行判斷的,他與全等的區別不大,有兩點:

-0 === 0

true

object.is(-0, 0)

false

nan === nan

false

object.is(-nan, nan)

true

然而有趣的是!set中的-0和0也是true,嗯還有有點奇怪。

同時set與陣列之間可以通過延展操作展開。

qq.

add(

)set(3

)}qq.add()

set(4)

,}

可以看到,和我們想象的不一樣,『{}』並不會被轉化成』[object, object]』。

說完了奇怪的set,讓我們看看map,map和物件最大的不同應該就是鍵可以是任意型別:

>

let a =

undefined

>

let b =

newmap()

undefined

> b.

set(a,2)

map

=>2}

>

let c =

undefined

> c[a]=2

2> c

有趣的是map的初始化,照理說應該傳個物件啥的,它穿的是特殊的物件–陣列,同時陣列的子項也得是陣列:

>

let a =

newmap([

[1,2

],['a'

,'b']]

)undefined

> a

map

與前者相同,它的foreeah方法也是一樣的三個傳參,這裡就不演示了。

一文帶你看懂資料庫的CRUD

ddl 運算元據庫 表 1.運算元據庫 crud c create 建立 建立資料庫 create database 資料庫名稱 建立資料庫,判斷不存在,再建立 create database if not exists 資料庫名稱 建立資料庫,並指定字符集 create database 資料庫名...

一文看懂全能的reduce

關於陣列的遍歷方法,我們使用最多的應該就是foreach和map了,一些人可能知道這兩個方法除去效能差別,最大的不同就是返回值還是原陣列修改的問題,但是對更多的陣列方法可能並不是很了解,fliter和some,every等方法這裡就不講了,他們的使用方式都比較好理解,這篇文章主要講講最麻煩的redu...

一文帶你搞懂python中的property

通常我們在獲得變數的一些私有屬性時,必須通過方法來獲取私有屬性,並不能直接訪問 修改其數值的時候也是要通過方法去修改,這樣非常的不方便 所以python提供了一種方式,將呼叫方法的的形式轉變為訪問屬性,這樣使用非常方便 class student def init self 這是乙個私有屬性 sel...