Ts之Symbol类型

141 阅读2分钟

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

let a1:symbol = Symbol('key'); // 可以接收三个值
let a2:symbol = Symbol("key"); // 可选的字符串key
//for Symbol for全局symbol 查找有没有注册过这个 key 如果有就直接拿来用,没有就创建一个,所以 这里一定是为 true 的
console.log(Symbol.for('daBai') === Symbol.for('daBai')) //返回为 true

// 应用
let obj ={
    name:'大白',
    [a1]:1230,
    [a2]:'原神',
}
//  输出结果: { name: '大白', [Symbol(key)]: 1230, [Symbol(key)]: '原神' }
// 可以发现 Symbol是一样的,但是他里面的值却没有覆盖掉,Symbol就是去解决属性的 key 值重复的问题
console.log(obj)

// for in 不能读到 Symbol
for (let i in obj){
    console.log(i)
    // 打印结果: name  只能读到name ,symbol 是读不到的
}
console.log(Object.keys(obj))  // 打印结果: [ 'name' ]  symbol 也是读不到的
console.log(Object.getOwnPropertyNames(obj)) // 同上,也是读取不到

// 这个方法是可以读取到 symbol 的
console.log(Object.getOwnPropertySymbols(obj)) //[ Symbol(key), Symbol(key) ]

// 这可以读取到 name 和 symbol
console.log(Reflect.ownKeys(obj)) //[ 'name', Symbol(key), Symbol(key) ]

[迭代器|生成器]

生成器

//生成器 跟迭代器用法一样
function * atn(){
    yield Promise.resolve('大白') // 同步 后面跟异步 都可以
    yield '小白'
    yield '原神'
    yield 'LoL'
}
const a =atn()
console.log('第一次调用',a.next()) // 再调用第二次,会返回第二个值,按顺序来
console.log('第二次调用',a.next())
console.log('第3次调用',a.next())
console.log('第4次调用',a.next())
console.log('第5次调用',a.next()) // x此时 done:true  ,是因为已经没有东西可以迭代了

图片.png

  • 在 TypeScript 中,迭代器有以下几个:
  1. for…of 循环:for…of 循环可以遍历所有可迭代对象中的值。

  2. forEach() 方法:forEach() 方法可以对数组进行迭代,不需要手动创建迭代器。

  3. entries() 方法:entries() 方法可以返回一个包含键/值对的迭代器。

  4. keys() 方法:keys() 方法返回一个包含所有键的迭代器。

  5. values() 方法:values() 方法返回一个包含所有值的迭代器。

  6. Symbol.iterator 属性:Symbol.iterator 属性可以自定义可迭代对象中的迭代器

    可看ts文档

    www.tslang.cn/docs/handbo…

    迭代器

// set map
// Set 是一种集合型数据结构,它只会存储唯一的值,因此重复的数字只会被保留一次
let set: Set<number> = new Set([1, 1, 2, 2, 3, 4, 4, 5])  // 天然去重
console.log(set)

let map: Map<any, any> = new Map()
let Arr = [1, 2, 3]
map.set(Arr, '大白')
console.log(map.get(Arr)) // 可以取到 大白

// function ag(){
//     console.log(arguments) //伪数组
// }

// let ls = document.querySelectorAll('div') // 伪数组

const aer = (value:any) =>{
    let It:any = value[Symbol.iterator]()
    let next:any = {done:false}
    while (!next.done){
        next = It.next()
        if(!next.done){
            console.log(next.value)
        }
    }
}
// // 支持 map set Arr
 aer(map) // 打印结果:[ [ 1, 2, 3 ], '大白' ]
// 迭代器的语法糖 for of
for (let value of map) {
    console.log(value) // 此时报错
}
// for of 对象不能用
// for (let value of {age:20}){
//     console.log(value) // 此时报错
// }

// 解构  也是调用 iterator
let [q, s, d] = ['LOL', '原神', '大白']
console.log(q, s, d)

让对象支持 for of

let obj = {
  items: [1, 2, 3],
  [Symbol.iterator]() {
    let index = 0;
    let items = this.items;
    return {
      next() {
        if (index < items.length) {
          return { value: items[index++], done: false };
        } else {
          return { done: true };
        }
      }
    };
  }
};

for (let item of obj) {
  console.log(item);
}