es6-Symbol

154 阅读2分钟

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 方法,返回对象默认遍历器

参考 es6.ruanyifeng.com/#docs/symbo…