隨著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...