Skip to content

Symbol数据类型

发表于
更新于
阅读量

symbol的实例是唯一的不可变的,用于确保对象的属性不重复

使用方式:调用Symbol(标识)函数返回一个符号

javascript
const a = Symbol('a')
const obj = {
    [a]:1
}
console.log(obj) // {Symbol(a):1}

Symbol() 函数不可以 new

符号代表唯一的值, 但是我就想用一个符号呢 ?

通过 Symbol.for () 创建一个全局符号

javascript
const a = Symbol('a')
const b = Symbol.for('b')
const b2 = Symbol.for('b')
const obj = {
    [a]:1,
    [b]:2,
    [b2]:3
}
console.log(b === b2) // true
console.log(obj) // // {Symbol(a): 1, Symbol(b): 3}
// key通过覆盖替换
// b 和 b2 指向同一个符号

通过 Symbol.keyFor () 查看全局符号 参数是全局符号 返回符号的描述

如果传的不是全局符号 返回undefined

如果传的不是符号 报错

javascript
const b = Symbol.for('b123')
console.log(Symbol.keyFor(b)) // b123

Symbol 数据类型的特点是唯一性,即使是用同一个变量生成的值也不相等

javascript
let id1 = Symbol("id")
let id2 = Symbol("id")
console.log(id1 == id2) // false

Symbol数据类型的另一个特点是隐藏特性,for···in,object.keys() 不能访问

javascript
let id = Symbol("id");
let obj = {
  [id]:'symbol'
};
for(let option in obj){
    console.log(obj[option]); //空
}

但是也有能够访问的方法:Object.getOwnPropertySymbols Object.getOwnPropertySymbols 方法会返回一个数组,成员是当前对象的所有用作属性名的 Symbol 值。

javascript
 let id = Symbol("id");
 let obj = {
  [id]:'symbol'
 };
let array = Object.getOwnPropertySymbols(obj);
 console.log(array); //[Symbol(id)]
 console.log(obj[array[0]]);  //'symbol'

在创建symbol类型数据 时的参数只是作为标识使用,所以 Symbol() 也是可以的

常用的内置符号Symbol的工厂函数

Symbol.asyncIterator

此方法返回对象的默认的异步迭代器,可由for-await-of使用

javascript
// for await of 会调用对象以[Symbol.asyncIterator]为键的函数 该函数返回异步的generator
class Foo{
    constructor(n){
        this.n = n
        this.i = 0
    }
    async *[Symbol.asyncIterator](){
        while(this.i < this.n){
            yield Promise.resolve(this.i++)
        }
    }
}
async function fn(){
	const p = new Foo(5)
	for await (const x of p){
		console.log(x)
	}
}
fn() // 0 1 2 3 4

Released under the MIT License.