详解如何优雅迭代JavaScript字面对象

详解如何优雅迭代JavaScript字面对象

目录

为什么要实现自定义迭代器

如何实现JavaScript字面量对象迭代

实现方法

解析为什么生成器函数要这样设计

为什么要实现自定义迭代器

因为在JavaScript中字面量对象是不支持迭代的

如何实现JavaScript字面量对象迭代

只要正确实现字面对象的Symbol.iterator这个属性所对应的迭代器函数即可

注意⚠️该迭代器函数只是一个函数,而不是真正的迭代器

迭代器是一个对象,需要提供next函数来提供给类似for of forEach这种迭代函数使用

实现方法

第一种使用比较简单的遍历来实现

let obj = {uname: "zhangsan"}; obj[Symbol.iterator] = function () { const keys = Object.keys(this); let index = 0; return { next() { return { value: obj[keys[index++]], done: index > keys.length } } }; }; let iterator = obj[Symbol.iterator](); console.log(iterator.next()); //{value: 'zhangsan', done: false} obj.uname='sudongyu' iterator = obj[Symbol.iterator](); console.log(iterator.next()); //{value: 'sudongyu', done: false}

第二种使用生成器函数来实现

/** * 将{}对象转换为可迭代对象 */ function object2iterator(obj){ obj[Symbol.iterator]=function* () { let properties = Object.keys(this); for (let i of properties) { yield [i, this[i]]; } } return obj }

生成器详细API 请参考 mdn

解析为什么生成器函数要这样设计

以下纯个人理解,如果有歧义就当我放屁~ 哈哈哈

迭代器函数是一个函数,这样每次调用都会为将要return的迭代器中的next函数创建一个全新的词法作用域

这样每次在创建新的迭代器时,执行iterator.next()的时候就可以利用闭包访问到属于自己的外层词法环境中的变量,在方法一中也就是能够从index为0开始迭代

这样每个独立的迭代器对象就能相互隔离~

注意⚠️:我还想表达以下几个观点:

JavaScript中的对象只是数据的载体,集合

所以我们不能把对象中的函数或者属性作为对象的一部分

对象的属性和函数它们只是一个间接的关系,虽然有点难理解,但是我还是想表达一下这个观点

打个比方来讲,你(对象)身上的钱(属性或者对象上的函数)只是你作为了它暂时的载体,并不意味着这个钱就属于你身体的一部分

总结

到此这篇关于如何优雅迭代JavaScript字面对象的文章就介绍到这了,更多相关迭代JS字面对象内容请搜索易知道(ezd.cc)以前的文章或继续浏览下面的相关文章希望大家以后多多支持易知道(ezd.cc)!

推荐阅读

    excel怎么用乘法函数

    excel怎么用乘法函数,乘法,函数,哪个,excel乘法函数怎么用?1、首先用鼠标选中要计算的单元格。2、然后选中单元格后点击左上方工具栏的fx公

    excel中乘法函数是什么?

    excel中乘法函数是什么?,乘法,函数,什么,打开表格,在C1单元格中输入“=A1*B1”乘法公式。以此类推到多个单元。1、A1*B1=C1的Excel乘法公式

    标准差excel用什么函数?

    标准差excel用什么函数?,函数,标准,什么,在数据单元格的下方输入l标准差公式函数公式“=STDEVPA(C2:C6)”。按下回车,求出标准公差值。详细

    excel常用函数都有哪些?

    excel常用函数都有哪些?,函数,哪些,常用,1、SUM函数:SUM函数的作用是求和。函数公式为=sum()例如:统计一个单元格区域:=sum(A1:A10)  统计多个

    Python之可迭代对象、迭代器、生成器

    Python之可迭代对象、迭代器、生成器,迭代,生成器,一、概念描述可迭代对象就是可以迭代的对象,我们可以通过内置的iter函数获取其迭代器,可

    应用程序对象

    应用程序对象,,应用程序对象是一个应用程序级对象,用于在所有用户之间共享信息,并且在Web应用程序运行期间可以保存数据。 应用的性质: 方法

    Java创建对象的几种方式

    Java创建对象的几种方式,对象,方法,本文目录Java创建对象的几种方式java中几种创建对象的方式1Java中创建对象的集中方式有那些JAVA创建对