Symbol的學習筆記 ES6系列5

2021-09-24 21:29:07 字數 3525 閱讀 3670

symbol的學習參考了以下大大們的部落格~僅為自己的學習筆記。

在es5中,物件的屬性都是字串,很容易引起命名衝突的問題。如果你寫乙個物件,需要有一些屬性名你不想別人誤操作或修改,則可以借助symbol來完成。

symbol為es6引入的第七種資料型別,也是原始資料型別。表示獨一無二的值。

乙個symbol型別的資料可以用symbol函式建立,但注意由於不是物件,不能使用new

let s1 =

symbol()

console.

log(

typeof

(s1)

)//symbol

symbol函式可以接收乙個字串作為引數,傳入的字串是對symbol的描述。方便我們區分。

let s2 =

symbol

("s"

)

由於傳入的字串僅為描述,所以即使傳入相同的描述,symbol建立出來的資料仍然是獨一無二的。

let s3 =

symbol

("s"

)console.

log(s2 == s3)

//false

console.

log(s2 === s3)

//false

symbol函式還可以接收乙個物件作為引數,但是會先呼叫物件的tostring()方法,並將其返回值作為對symbol的描述。

let obj =

}let s4 =

symbol

(obj)

console.

log(s4)

//symbol(cjx)

有時如果你想要檢視乙個symbol資料的描述,可以使用description方法,具體如下

let obj =

}let s4 =

symbol

(obj)

console.

log(s4.description)

//cjx

由於symbol這獨一無二的特性,所以symbol值我們一般用做物件的屬性值。具體的寫法如下:

let name =

symbol

("name"

)let age =

symbol

("age"

)let gender =

symbol

("gender"

)let obj =

//第二種寫法

obj[age]=18

//第三種寫法

注意:使用symbol的值做屬性的時候,不能使用.屬性名來訪問,應使用來訪問。如上例中,如果這樣寫會取不到

console.

log(

"不應用.訪問"

,obj.name)

console.

log(

"應使用訪問"

,obj[name]

)

使用symbol 值作為屬性名時,該屬性是公有屬性不是私有屬性。

但要注意,使用for…in, for…of無法遍歷到以symbol值作為屬性名的屬性

console.

log(

"----for in----"

)for

(let key in obj)

console.

log(

"----getownpropertysymbols----"

)let symbolattr = object.

getownpropertysymbols

(obj)

//返回乙個陣列

從上面我們可以看到,使用for…in方法只能遍歷到非symbol值的屬性使用getownpropertysymbols只能獲取到symbol值的屬性使用reflect.ownkeys可以獲取到所有共有屬性

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

symbol.for()接受乙個字串作為引數,然後搜尋有沒有以該引數作為名稱的symbol值。如果有,就返回這個symbol值,否則就新建這樣乙個symbol值。

let s1 = symbol.

for(

's')

let s2 = symbol.

for(

's')

console.

log(s1===s2)

//true

這裡還引入了乙個登記機制的概念。使用symbol.for建立的會被登記在全域性環境中供搜尋,而使用symbol建立的不會被登記。

symbol.keyfor()方法會返回乙個已登記的symbol型別值的key,如:

let s1 =

symbol

("s"

)let s2 = symbol.

for(

"s")

console.

log(

"未登記"

,symbol.

keyfor

(s1)

) console.

log(

"登記"

,symbol.

keyfor

(s2)

)

es6 學習筆記(二)Symbol

symbol類似於enum,可以起到識別符號的作用。主要可以應用在一下場景。1.可以作為屬性名 var mysymbol symbol var a a.mysymbol hello a mysymbol undefined a mysymbol hello 要注意symbol值作為物件屬性名時,不能...

ES6 新增的型別Symbol

symbol 是es6中新增的一種資料型別,是唯一的識別符號,可以作為物件的唯一屬性名 symbol 可以代替乙個常量,指的常量的值唯一 symbol 的特點 唯一性 即使兩個變數型別,值都一樣,也不相等 let id1 symbol id let id2 symbol id console.log...

ES6個人筆記記錄 Symbol

es5 的物件屬性名都是字串,這容易造成屬性名的衝突 比如,我們使用了乙個他人提供的物件,但又想為這個物件新增新的方法cmixin 模式 新方法的名字就有可能與現有方法產生衝突。es6引入了一種新的原始資料型別symbol,表示獨一無二的值 是第七種資料型別 1.number 2.string 3....