Symbol
Symbol,标识一种独一无二的值,Symbol由Symbol函数生成。
用法
let s1 = Symbol();
let s2 = Symbol();
console.log(s1); // Symbol()
console.log(s2); // Symbol()
s1==s2 //false
Symbol函数创建的值都是独一无二的,所以两个值不相等
s1和s2我们无法区别,所以Symbol函数可以接收一个参数,这个参数是对Symbol值的描述。如果是相同参数,返回的值也是不相等的
let s1 = Symbol('s1');
let s2 = Symbol('s2');
console.log(s1); // Symbol(s1)
console.log(s2); // Symbol(s2)
s1==s2 //false
let s3 = Symbol('s3')
s1==s3 // false
当然,也是有办法重新使用同一个Symbol值的
Symbol.for()
接收一个字符串参数,然后搜索有没有以该参数作为名称的Symbol的值,有则返回这个Symbol,没有则创建新的Symbol值
let s1 = Symbol.for('s1')
let s2 = Symbol.for('s1')
s1===s2 //true
用Symbol.for()创建的值会注册到全局,而Symbol()不会
function foo(){
return Symbol.for('bar')
}
const x = foo()
const y = Symbol.for('bar')
console.log(x===y) // true
使用场景
1.对象属性名
对象新加属性时,可能会有有重名情况,而Symbol可以解决这一问题,使用Symbol作为属性名时,不能使用点运算符,可以使用以下几种方法
let mySymbol = Symbol()
// 第一种
let a = {}
a[mySymbol] = '小明'
//第二种
let a = {
[mySymbol]: '小明'
}
// 第三种
let a = {}
Object.defineProperty(a,mySymbol,{
value:'小明'
})
// 这样式错误的
let a = {}
a.mySymbol // 不可以使用点运算符
a[mySymbol]
2.用作常量
属性名遍历
遍历对象时,该属性不会出现在 for...in 、for...of中,也不会被Ojbect.keys()、Object.getOwnPropertyNames()、Json.stringfy()返回,它也不是私有属性,
通过Object.getOwnPropertySymbols() 可以获取指定对象的所有Symbol属性, 返回值是数组
const obj = {}
let a = Symbol('a')
obj[a]='aaaa'
console.log(Object.getOwnPropertySymbols())
// [Symbol(a)]
内置Symbol(有十一个)
Symbol.hasInstance
Symbol.Iteraor
for...of 循环时,会调用对象的Symbol.Iteraor 方法,返回对象默认遍历器