Symbol基本資料型別 ES6重刷11

2021-09-28 11:36:06 字數 1929 閱讀 5832

在es6中除了以前的六種資料型別【基本資料型別:undefined、null、number、string、boolean,引用資料型別:object】,新增了一種基本資料型別symbol,在此我就談談它的某些本人認知到的特點。

一、獨一無二性

引入這個基本資料型別的初衷就是因為它的獨一無二的特性,這將會解決潛在的問題,關於命名的衝突問題,比如給乙個為外在資源中的乙個物件進行新增屬性,這就可以利用symbol的獨一無二的特性避免潛在的屬性名衝突。

const obj =

obj[symbol.

for(

'addc')]

='value_c'

// 至於為什麼用symbol.for()而不直接用symbol(),是因為symbol.for()是存在全域性登記機制,而symbol()是沒有全域性登記機制的

// 這就意味著,我需要給它乙個單獨的變數,而這種情況是我不願看到的,為每乙個特殊屬性名設定變數

// 造成變數的堆砌氾濫,導致後期難以清楚知道這代表了什麼

console.

log(obj)

//

二、利用其獨一無二性來消除魔法字串

在一種場景,不在乎值具體是什麼,而在乎值相互不同,從而進行語句判斷,比如:利用物件鍵值對的一一對應特性,結合switch語句來代替多重if...else...判斷。

const obj =

const

test=(

)=>

return''}

test

()

三、物件普通遍歷方法無法被選中

也就是說,symbol 作為屬性名,該屬性不會出現在for...in迴圈中,也不會被object.keys()、object.getownpropertynames()、json.stringify()返回。

利用這種特性,我們就可以將某些不需要或則不願意被遍歷到的屬性名、屬性值,利用symbol作為其屬性名,這樣就避免利用object.defineproperty方法對每個特殊的屬性名進行屬性特性的重定義。

const obj =

obj[

symbol

('case_4')]

='case_4'

// 注意,const凍結的只是obj這個指向其內部儲存位置的指標

// 而不是其內部儲存,所以儘管物件obj是const宣告,也可以修改、增加、減少其內部的屬性

console.

log(obj)

for(

const item in obj)

四、對於symbol()、symbol.for()、symbol.keyfor()的區別

1、symbol():每次單純的返回乙個獨一無二的symbol值,即使內部的描述字串是一致的,比如symbol(『case』)和symbol(『case』),但是兩者的值卻是不同的。

注意,symbol()沒有全域性登記機制。

2、symbol.for():每次會先在全域性登記表中搜尋與其描述字串一致的symbol值,比如symbol.for(『case』)和symbol.for(『case』),兩者的值是一致的;若沒有搜尋到與其描述字串一致的symbol值,就會在全域性登記表中登記此次返回的symbol值。

注意,symbol.fo()存在全域性登記機制。

3、symbol.keyfor():搜尋全域性登記表中與其描述字串一致的symbol值,若沒有搜尋到與其描述字串一致的symbol值,則返回undefined。

ES6新增基本資料型別Symbol

es6 引入了一種新的原始資料型別 symbol,表示獨一無二的值,最大的用法是用來定義物件的唯一屬性名。es6 資料型別除了number string boolean objec t null 和 undefined,還新增了 symbol 由於每乙個 symbol 的值都是不相等的,所以 sym...

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

ES6新資料型別 Symbol

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