es6中引入了新的基础数据类型:
Symbol
,唯一的标识。
那么在es6中,数据类型就变成了:Number
、String
、Boolean
、Null
、undefined
、Symbol
、object
7种
使用方式
// 通过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,所以严格来说,并不能完全的实现类的私有属性和方法