老师这些代码不懂啊

来源:2-9 原生可遍历和非原生可遍历

球球不一般

2022-01-03 19:50:27

3.非原生可遍历的有哪些

      // 一般的对象

      const person = { sex: 'male', age: 18 };

      // console.log(person[Symbol.iterator]());


      // {next()} {value,done}

      // person[Symbol.iterator] = () => {

      //   let index = 0;

      //   return {

      //     next() {

      //       index++;


      //       if (index === 1) {

      //         return {

      //           value: person.age,

      //           done: false

      //         };

      //       } else if (index === 2) {

      //         return {

      //           value: person.sex,

      //           done: false

      //         };

      //       } else {

      //         return {

      //           done: true

      //         };

      //       }

      //     }

      //   };

      // };


      // for (const item of person) {

      //   console.log(item);

      // }

      // for in


      // 有 length 和索引属性的对象

      const obj = {

        '0': 'alex',

        '1': 'male',

        length: 2

      };


      obj[Symbol.iterator] = Array.prototype[Symbol.iterator];


      // obj[Symbol.iterator] = () => {

      //   let index = 0;


      //   return {

      //     next() {

      //       let value, done;

      //       if (index < obj.length) {

      //         value = obj[index];

      //         done = false;

      //       } else {

      //         value = undefined;

      //         done = true;

      //       }


      //       index++;


      //       return {

      //         value,

      //         done

      //       };

      //     }

      //   };

      // };

      for (const item of obj) {

        console.log(item);

      }

搜索

复制

写回答

1回答

好帮手慕然然

2022-01-04

同学你好,解答如下:

这段代码主要是讲解,如何遍历非原生可遍历对象(即不具有Symbol.iterator方法的对象),非原生可遍历对象不能直接使用for...of来遍历。所以,如果想要使用for...of来遍历的话,那么就要手动给其添加Symbol.iterator方法。

像person[Symbol.iterator] = () =>{}、obj[Symbol.iterator] = () => {} 这两段代码,是在给person对象以及obj对象添加Symbol.iterator方法。

其中,person一个是普通的对象,即 {sex: 'male',age: 18}。obj是一个带有 length 和索引属性的对象,即 {'0': 'alex','1': 'male',length: 2}。

对于普通对象来说,只能根据对象属性的个数,通过判断index值一步步来操作,比较麻烦。

而对于带有 length 和索引属性的对象来说,可以利用length属性(即对象属性的个数)和索引属性(即index值)来完成操作,不再需要一步步来判断。

而且对于带有 length 和索引属性的对象,还有一种更简单的添加Symbol.iterator方法的方式,即 obj[Symbol.iterator] = Array.prototype[Symbol.iterator]。

关于这段代码,建议同学能够大概了解其作用以及流程即可,不需要掌握,实际工作中基本用不到。

祝学习愉快!

0

0 学习 · 17877 问题

查看课程