Symbol 是何物?

68 阅读1分钟

Symbol

自ECMAScript 2015,symbol成为了一种新的原生类型,就像number和string等一样

symbol类型的值是通过Symbol构造函数创建的 可以传递参做为唯一标识 只支持 string 和 number 类型的参数

   let sym1 = Symbol('wodiu')
   let sym2 =Symbol()
   console.log(sym1,sym2);  

Symbol的值是唯一的

   let sy1 = Symbol()
   let sy2 = Symbol()
   console.log(sy1 === sy2); //false

问题来了,可以让两个symbol类型的值相等吗?

答案是 Yes!

const symbol1 = Symbol.for('foo');
const symbol2 = Symbol.for('foo');

console.log(symbol1 === symbol2); // true

用作对象的属性

let obj = {
     [sym2]:"value",
     str1:'岂有此理'
}

console.log(obj[sym2]);

使用symbol定义的属性,是不能通过如下方式遍历拿到的

let sy2 = Symbol()
let obj = {
    [sym2]:"value",
    str1:'岂有此理'
}
1. for in 遍历
for(let key in obj){
  console.log(key,'for in'); // str1
}

//2. Object.keys 遍历
console.log(Object.keys(obj));  //['str1']

//3. getOwnPropertyNames
console.log(Object.getOwnPropertyNames(obj));  //['str1']

//4. JSON.stringfy
console.log(JSON.stringify(obj));   //{"str1":"岂有此理"}

怎么拿?

// 1 拿到具体的symbol 属性,对象中有几个就会拿到几个
console.log(Object.getOwnPropertySymbols(obj)); //[Symbol()]

// 2 es6 的Reflect 拿到对象的所有属性
console.log(Reflect.ownKeys(obj));  //['str1',Symbol()]

Symbol.iterator 迭代器 和 生成器 for of

var arr = [1,2,3,4]
let iterator = arr[Symbol.iterator]()

console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());

console.log(iterator.next());


支持遍历大部分类型迭代器 arr nodeList argumetns set map 等

interface item {
    name:string,
    age:number
}

const array:Array<item> = [{name:'zhou',age:18},{name:'wang',age:16}]

type mapTypes = string | number

const map:Map<mapTypes,mapTypes> = new Map()
map.set('1','陆南de')
map.set(123,'路北的')

let set:Set<number> = new Set([1,222,222,3,4,3])

我们写一个迭代函数

const gen = (arg:any):void => {
    let it: Iterator<any> = arg[Symbol.iterator]()
    let next:any = {done:false}
    while (!next.done) {
        next = it.next()
        if(!next.done){
            console.log(next.value);
        }
    }
}

我们平时开发中不会手动调用iterator 应为 他是有语法糖的就是for of  记住 for of 是不能循环对象的y因为对象没有 iterator

 for (let value of map) {
    console.log(value)
}