es6中引入了新的基礎資料類型:
Symbol
,唯一的辨別。
那麼在es6中,資料類型就變成了:
、
Number
String
Boolean
Null
undefined
Symbol
7種
object
使用方式
// 通過Symbol()函數來建立一個Symbol執行個體
var s = Symbol()
// 或者傳入可選的字元串參數
var s2 = Symbol('test symbol')
typeof s // 'symbol'
var s3 = Symbol('test symbol')
s2 === s3 // false 唯一性
使用場景1:使用Symbol來作為對象屬性的key
var name = Symbol()
var obj = {
[name]: '小青',
age: 12
}
obj[name] // 小青
注意:使用symbol類型的資料作為key,此時這個key為不可枚舉類型,使用`Object.keys()`或者`for..in`是擷取不到對應的key的
var obj = {
s1: 1,
[s2]: 2,
s3: 4
}
console.log(Object.keys(obj)) // s1 s3
for(var k in obj) {
console.log(k) // s1 s3
}
當然我們也可以擷取到symbol類型的key的,使用如下兩個方法
// 使用Object的API
Object.getOwnPropertySymbols(obj) // [Symbol(name)]
// 使用新增的反射API
Reflect.ownKeys(obj) // [Symbol(name), 'age', 'title']
使用場景2:使用Symbol定義類的私有屬性或方法
var Animal = (function() {
var AGE_SY = Symbol()
var GET_NAME = Symbol()
class Animal {
constructor(name, age) {
this.name = name
this[AGE_SY] = age
}
[GET_NAME]() {
console.log(this.name)
}
}
return Animal
})()
如上,我們用閉包和Symbol,才盡可能的實作了類的私有化方法或屬性。
當我們new Animal執行個體的時候,并不能擷取内部定義的symbol變量,是以就不能擷取symbol定義的屬性和方法。但是,之前我們說過可以通過getOwnPropertySymbols獲得symbol定義的key,是以嚴格來說,并不能完全的實作類的私有屬性和方法