大家都知道,es5的物件的屬性名都是字串,這樣就很容易造成屬性名衝突,從而替代了原有物件的方法,於是,es6就提供了symbol,表示獨一無二的值,它是一種新的原始資料型別,symbol型別。
注意哦!symbol是基本資料型別,所以不能使用new命令,否則會報錯。
let s1 =
symbol([
1,2]
);let s2 =
symbol
('bar');
console.
log(s1)
// symbol(1,2)
console.
log(s2)
// symbol(bar)
這裡可以看到,symbol是可以接受乙個字串作為引數的,僅用來對symbol例項的描述。
let s1 =
symbol
('foo');
let s2 =
symbol
('foo');
s1 === s2 // false
以上**,就可以很明顯的看出來,引數只是它的描述,另外需要注意的是,如果傳入的引數是乙個物件的話(無論是陣列物件還是咱們口中的物件),它都會執行物件的tostring()方法,如下所示。
let s1 =
symbol()
;let s2 =
symbol([
1,2]
);let s3=
symbol()
console.
log(s1)
//symbol([object object])
console.
log(s2)
//symbol(1,2)
console.
log(s3)
//symbol(2)
還需要注意的是,symbol不允許和其他資料型別的值進行運算,否則會報錯,但是可以顯示的轉為字串或者布林值。
作為屬性名使用時不能用點形式,必須放在方括號內,如果用點,宣告的是普通屬性名,並不是symbol,如下**所示:
let mysymbol =
symbol()
;let a =
; a.mysymbol=
"yes"
a[mysymbol]
='hello!'
; console.
log(a[
"mysymbol"])
//yes
console.
log(a[mysymbol]
)//hello
需要注意的是,作為屬性名使用時,是不會被for...in、for...of、object.keys()、object.getownpropertynames()、json.stringify()
返回的,但他並不是私有屬性,用object.getownpropertysymbols()
這個方法,可以獲取到所有的symbol屬性名,還有乙個新api,就是reflect.ownkeys
,它返回所有鍵值,包括常規屬性。
let mysymbol=
symbol(1
)let a=
for(
let i in a)
//namein
for(
let i of object.
keys
(a))
for(
let i of reflect.
ownkeys
(a))
//name symbol(1)
for(
let i of object.
getownpropertysymbols
(a))
//symbol(1)
但是,我們可以利用這一特點,為物件設定一些即沒暴漏出去,又再內部能使用的方法。
let size =
symbol
('size');
class
collection
add(
)sizeof()
}let x =
newcollection()
; x.
add(
) console.
log(x.
sizeof()
)//1
console.
log(object.
keys
(x))
// ['x']
console.
log(object.
getownpropertynames
(x))
// ['x']
console.
log(object.
getownpropertysymbols
(x))
// [symbol(size)]
上面**可以看出,當呼叫x.add()方法後,內部symbol值size是改變了,但是類外部,是訪問不到例項屬性的。
symbol.for可以使用相同的symbol的值,它接受乙個字串作為引數,然後搜尋有沒有以該引數作為名稱的 symbol 值。如果有,就返回這個 symbol 值,否則就新建並返回乙個以該字串為名稱的 symbol 值。
let s1 = symbol.
for(
'foo');
let s2 = symbol.
for(
'foo');
s1 === s2 // true
symbol.keyfor方法返回乙個已登記的 symbol 型別值的key。
let s1 = symbol.
for(
"foo");
symbol.
keyfor
(s1)
// "foo"
let s2 =
symbol
("foo");
symbol.
keyfor
(s2)
// undefined
阮博士的es6入門 ES6 symbol 以及symbol的簡單應用
1.es6 引入了一種新的原始資料型別symbol,表示獨一無二的值。2.symbol 值通過symbol函式生成。3.symbol 函式可以接受乙個字串作為引數,表示對 symbol 例項的描述,主要是為了在控制台顯示,或者轉為字串時,比較容易區分。4.es2019 提供了乙個例項屬性descri...
ES6 Symbol資料型別
基本的資料型別 null undefined number boolean string symbol 引用資料型別 object let s1 symbol let s2 symbol console.log typeof s1 symbol console.log s1 s2 false1 sy...
ES6 Symbol在物件中的作用
宣告symbol 我們先來回顧一下我們的資料型別,在最後在看看symbol如何宣告,並進行乙個資料型別的判斷。var a new string var b new number var c new boolean var d new array var e new object var f symb...