在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 就有七種資料型別了。一 ...