4 / 4 聊一聊Symbol.iterator属性

前面的话

前端每日,巩固基础,不打烊!!!

解答

从一道题来分析:

我们需要向对象person添加什么,以致执行[…person]时,获得形如[‘xiaoq’,20]的输出。

 const person = {
        name: 'xiaoqi',
        age: 20
    }
 //    [...person]; ?  // ['xiaoqi',20] 
 
分析
  • 对象默认不是可迭代的,如果通过[Symbol.iterator]来定义迭代规则,那么对象就是可迭代的。
  • 只有可迭代的对象,才能使用[…person]变成数组,ES6中的数组、Set/Map、字符串都有默认的迭代器和Symbol.iterator属性。
  • 通过生成器Generator返回的迭代器也是可迭代的对象,因为生产器默认会为Symbol.iterator属性赋值
  • 注意:弱引用集合WeakSet与WeakMap集合是不可迭代的。
Symbol.iterator

可迭代对象的Symbol.iterator属性是一个函数:

let list  = [11, 22, 33];
let iterator = list[Symbol.iterator]();
console.log(iterator.next()); // {value: 11, done: false}
创建可迭代对象
let test = {
        items: [11,22, 33],
        *[Symbol.iterator]() {
           for(let item of this.items){
               yield item;
           }
        }
    } 
    for(let item of test) {
        console.log(item);
    }

for ... ofGennerator函数配合使用,这样不需要再调用next方法。

  • Iterator接口主要供for…of消费,for…of循环会自动寻找Iterator接口,默认的Iterator接口部署在数据结构的Symbol.iterator属性,数据结构只要具有Symbol.iterator属性,就一个使用for…of或者…扩展运算符。
  • 类数组:DOM Nodelist, arguments等对象都可以使用for…of与扩展运算符。
回到本题

person不是可迭代对象,使用Symbol.iterator使之成为可遍历的:

const person = {
        name: 'xiaoqi',
        age: 20,
        *[Symbol.iterator]() {
            yield this.name;
            yield this.age;
           
        }
    }

   console.log( [...person]); 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值