每日一题2020-04-20

2020-04-20  本文已影响0人  欢欢小天使K

每日一题

var obj = {x: 1, y: 2, z: 3};
[...obj]
能否以某种方式为上面的语句是用展开运算而不导致类型错误,如果可以,写出解决方式

答案:可以。解决方式见解析

解析:

展开语法和for...of语句遍历iterable对象定义要遍历的数据。
Array和Map是具有默认迭代行为的内置迭代器。对象不是可迭代的,但是可以通过使用iterable和iterator协议使他们可迭代。
在Mozilla文档中,如果一个对象实现了@iterabtor方法,那么他就是可迭代的,这意味着这个对象(或者他的原型链上的一个对象)
必须有一个带有@iterator键的属性,这个键可以通过常量Symbol.iterator获得。

  //解决方式一
  var obj = { x: 1, y: 2, z: 3 };
  obj[Symbol.iterator] = function(){
    //iterator 是一个具有next方法的对象
    //他的返回至少有一个对象
    //两个属性: value & done。
    return {
      //返回一个iterator对象
      next: function(){
        if(this._countDown === 7){
          // const lastValue = this._countDown;
          return { value: this._countDown, done: true };
        }
        this._countDown = this._countDown + 1;
        return { value: this._countDown, done: false };
      },
      _countDown: 0,
    };
  };
  console.log([...obj])

控制台执行结果:


image.png
上一篇 下一篇

猜你喜欢

热点阅读