ES2015 Symbol 一種全新的原始資料型別

2021-10-10 08:03:09 字數 3540 閱讀 6375

在es2015之前,物件的屬性名都是字串,而字串有可能會重複,重複的話有可能會有衝突。

看乙個例子,比如有3個js檔案

// share.js*****====

const cache =

// a.js*****====

cache[

'foo']=

'123'

// b.js*****====

cache[

'foo'

]= math.

random()

console.

log(

catch

)

現在我們大量使用第三方庫,很多時候需要自己去擴充套件。如果出現屬性重複怎麼辦呢?

es2015之前的解決方案:約定

給屬性名新增特定字首,比如說vue內部也使用$和_作為內部方法或屬性。

// share.js*****====

const cache =

// a.js*****====

cache[

'a_foo']=

'123'

// b.js*****====

cache[

'b_foo'

]= math.

random()

console.

log(

catch

)

在es2015中,新增了一種原始資料型別symbol—— 表示獨一無二的值。

基本使用:

const s =

symbol()

console.

log(s)

// symbol()

console.

log(

typeof s)

// symbol

通過symbol建立的值都是獨一無二的,它永遠不會重複:

console.

log(

symbol()

===symbol()

)//false

console.

log(

symbol

('foo'

)===

symbol

('foo'))

//false

symbol 可以傳入乙個字串,作為這個值的描述文字,用於區分 :

console.

log(

symbol

('foo'))

// symbol(foo)

console.

log(

symbol

('baz'))

// symbol(baz)

從es2015開始,物件就可以使用symbol型別的值作為屬性名

新增物件的屬性名可以是2種型別:stringsymbol

const obj =

obj[

symbol()

]=789;

console.

log(obj)

//

以前對私有成員都是靠約定,例如我們約定用下劃線_開頭就表示是私有成員,我們約定外界不允許訪問物件中以下劃線開頭的成員。

現在,我們可以使用symbol來建立私有成員的屬性名

用symbol來實現私有成員的屬性名:

// a.js*****====對外暴露乙個物件person

const name =

symbol()

const person =

}// b.js*****====

person.

say(

)// zce

symbol目前最主要的作用就是為物件新增獨一無二的屬性名

截止到es2019,一共定義了7種資料型別:6種原始資料型別 (string、number、null、undefined、boolean、symbol) +一種複雜資料型別 object

未來還會新增一種原始資料型別bigint,標準化過後就是8種資料型別了。

如果需要在全域性去復用乙個symbol,可以用全域性變數,或者用symbol型別提供的乙個靜態方法symbol.for()去實現

symbol.for()要求傳入的引數是字串string,如果傳入的引數是其他型別,會被自動轉為字串string

const s1 = symbol.

for(

'foo'

)const s2 = symbol.

for(

'foo'

)console.

log(s1 === s2)

// true

console.

log(symbol.

for(

'true'

)=== symbol.

for(

true

)// true

symbol提供了很多內建的symbol常量,用來作為內部方法的標識,這些識別符號可以讓自定義物件去實現一些js當中內建的介面

例如:

const obj =

console.

log(obj.

tostring()

)// [object object]

[object object]這個字串稱為物件的tostring標籤

如果想自定義物件的tostring標籤,可以在物件中新增乙個特定的成員來標識

如果用字串作為識別符號,有可能會和內部的成員產生重複

es2015 要求我們使用symbol值來實現這樣的介面:

const obj =

console.

log(obj.

tostring()

)// [object xobject]

使用symbol做作為屬性名

使用傳統的for in迴圈、object.keys()json.stringify()都拿不到symbol 型別的屬性

這個特性使得symbol型別的屬性特別適合用來作為物件的私有屬性

const obj =

// 那怎麼獲取symbol 型別的屬性?

object.

getownpropertysymbols()

// 使用方法類似於object.keys()

console.

log(object.

getownpropertysymbols

(obj));

// [ symbol() ]

一種高效全零塊檢測方法

一種自適應低複雜度全零塊檢測演算法。主要是為了提高基於satd閾值的自適應檢測方法的檢測精度,節省rdo檢測時間。在傳統的satd檢測失敗後,提出了一種自適應搜尋時域低頻最大變換係數幅值的全零塊檢測方法。在變換量化之前提早地檢測出全零塊無疑是非常有必要的。現有的全零塊檢測技術大多數是使用sad或sa...

Python實現全排列的一種演算法

列表arr 1,2,3 輸出其全排列。採取遞迴推導的方法來實現。def perm arr 實現全排列 length len arr if length 1 遞迴出口 return arr result 儲存結果 fixed arr 0 rest arr 1 for arr in perm rest ...

一種基於ES5的JavaScript繼承

exports function.prototype.extends exports global.getprototypenames 基於es5的繼承實現函式 function.prototype.extends function 繼承乙個類。若有興許類,則共享興許類截至到當前的快照屬性 cons...