TS中的symbol类型

一、symbol类型


  • symbol类型的值是通过Symbol构造函数创建的。

  • 可以传递参做为唯一标识,只支持string和number类型的参数

在这里插入图片描述

二、symbol的特性


  • symbol具有唯一性
const sym1:symbol = Symbol(1)   //唯一性
const sym2:symbol = Symbol(1)   //唯一性
console.log(sym1,sym2);
console.log(sym1 === sym2);

在这里插入图片描述

  • for全局symbol有没有注册这个key,如果有直接拿来用,没有的话就去创建一个
const sym1:symbol = Symbol(1)
const sym2:symbol = Symbol(1)
console.log(Symbol.for('小青') === Symbol.for('小青'));  //true

在这里插入图片描述

  • 实际运用
const sym1:symbol = Symbol(1)
const sym2:symbol = Symbol(1)
// 使用场景
let obj = {
  name: '张三',
  [sym1]:111,
  [sym2]:222
}
console.log(obj);

在这里插入图片描述

三、获取数组的值


  • 获取value的值
const sym1:symbol = Symbol(1)
const sym2:symbol = Symbol(1)
// 使用场景
let obj = {
  name: '张三',
  [sym1]:111,
  [sym2]:222
}
// 1. Object.getOwnPropertySymbols  对象中有几个就获取几个值
console.log(Object.getOwnPropertySymbols(obj));
// 2. Reflect.ownKeys 获取所有属性的值
console.log(Reflect.ownKeys(obj));

在这里插入图片描述

  • 注意:无法获取value的值
const sym1:symbol = Symbol(1)
const sym2:symbol = Symbol(1)
// 使用场景
let obj = {
  name: '张三',
  [sym1]:111,
  [sym2]:222
}

// 1. for...in 遍历
for (const key in obj){
  console.log(key);
}

// 2. Object.keys
console.log(Object.keys(obj));

// 3. Object.getOwnPropertyNames
console.log(Object.getOwnPropertyNames(obj));

// 4. JSON.
console.log(JSON.stringify(obj));

在这里插入图片描述

四、迭代器和生成器


1. 生成器

function* gen(){
  yield Promise.resolve('小青')  // 支持同步和异步
  yield '大青'  
  yield '小青子'
  yield '大青子'
}

const man = gen()
console.log(man.next());
console.log(man.next());
console.log(man.next());
console.log(man.next());
console.log(man.next());

在这里插入图片描述

2. 迭代器

  • 迭代器的运用
let set:Set<number> = new Set([1,1,2,2,3,4,5,6])  //天然去重

let map: Map<any, any> = new Map()

let Arr =[1,2,3]
console.log(map.set(Arr, '小青'));
console.log(map.get(Arr));

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

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

在这里插入图片描述

在这里插入图片描述

let set:Set<number> = new Set([1,1,2,2,3,4,5,6])  
const each = (value:any):void =>{
  let It:any = value[Symbol.iterator]()
  let next:any = {done: false}
  while(!next.done){
    next = It.next()
    if(!next.done){
      console.log(next.value);
    }
  }
}
each(set)
  • 迭代器的语法糖:for...of
let set:Set<number> = new Set([1,1,2,2,3,4,5,6])  
for (let value of set) {
  console.log(value)
}

在这里插入图片描述
注意:for...of 对象不能使用

  • 数组解构的原理其实也是调用迭代器的
var [a,b,c] = [1,2,3]
var x1 = [4,5,6]
var x2 = [...x1]
console.log(a,b,c);
console.log(x2);
  • 实现一个迭代器让对象支持for ... of
const obj = {
  max: 5,
  current: 0,
  [Symbol.iterator]() {
    return {
      max: this.max,
      current: this.current,
      next() {
        if (this.current == this.max) {
          return {
            value: undefined,
            done: true
          }
        } else {
          return {
            value: this.current++,
            done: false
          }
        }
      }
    }
  }
}
console.log([...obj])

for (let val of obj) {
  console.log(val);
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值