js中...扩展运算符原理, 让Object类型也能使用扩展运算符

在看Generator函数时看到一句话

当调用一个Generator函数时,它并不会立即执行函数体,而是返回一个迭代器对象(Iterator)

 然后我搜了一下Symbol.Inerator

Symbol.iterator 是 JavaScript 中的一个内置 Symbol,它代表了一个对象的默认迭代器。当一个对象具有 Symbol.iterator 方法时,它就是一个可迭代对象,可以使用 for...of 循环或者 ... 运算符进行迭代

Symbol.iterator 方法返回一个迭代器对象,该迭代器对象有一个 next() 方法,每次调用 next() 方法都会返回一个包含 valuedone 两个属性的对象。其中 value 表示当前迭代到的值,done 表示迭代是否结束。

这里有一句话 “它就是一个可迭代对象,可以使用 for...of 循环或者 ... 运算符进行迭代”,嗯?只要又了Symbol.Inerator就可以去循环和扩展运算了吗,然后我尝试把一个Generator函数调用的使用...扩展打印,发现时确实就像数组一样

然后我搜了一下关于JS中...扩展运算符的原理

JS中 ... 的原理是使用迭代器(Iterator)对象来实现的。当使用 ... 运算符来展开一个可迭代对象时,JS引擎会自动调用该对象的 [Symbol.iterator]() 方法,获取该对象的迭代器对象(Iterator)。然后通过不断调用迭代器对象的 next() 方法来获取可迭代对象中的每个元素,直到迭代器对象返回 { done: true } 表示迭代结束

...的原理其实就是在该数据的原型链上查找[Symbol.iterator]这个方法,在找到这个方法会调用里面.next方法,接着判断return值中是否有value和done,当done为true时停止,并且不记录done为true时这一次的值

抱着来都来了的想法我尝试去改变Array的迭代器并且在Object上添加一个迭代器

改变Array上面的迭代器让 ...扩展运算符显示自定义内容

Array.prototype[Symbol.iterator] = function() {
  let index = 0; // 当前下标
  const that = this;
  return {
      next: () => {
          return { value: '自定义内容', done: that.length === index++ } // 先判断是否为最后一个再自增
      }
  }
};
let arr = [1, 2, 3, 4, 5];
[...arr]; // ['自定义内容', '自定义内容', '自定义内容', '自定义内容', '自定义内容']

 

给Object类型添加一个迭代器,让Object类型也能使用扩展运算符

Object.prototype[Symbol.iterator] = function() {
  const that = this;
  const keys = Object.keys(that);
  let index = 0;
  return {
    next: () => {
      const key = keys[index++];
      return { value: that[key], done: keys.length === index - 1 } // 这里index是自增后的数据所以-1
    }
  }
}
let obj = { code: 200, data: [], message: '操作成功' };
[...obj] // [200, [], '操作成功']

总结 

JS中的...扩展运算符会在原型链上找是否有Symbol.iterator这个迭代器,如果有则调用next方法,next方法需要返回一个对象上面需要有value和done,value就是当前值,done表示是否完成,done为true的那一次结果不会使用

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
2.ASP.NET.2.0.高级编程(第4版) [1/7] 原书名: Professional ASP.NET 2.0 原出版社: Wrox 作者:(美)Bill Evjen, Scott Hanselman, Farhan Muhammad [同作者作品] [作译者介绍] 译者: 李敏波[同译者作品] 出版社:清华大学出版社 ISBN:7302139067 上架时间:2006-11-16 出版日期:2006 年11月 开本:185×260 页码:1090 版次:4-1 内容简介回到顶部↑本书全面介绍了ASP.NET各种编程技能和2.0版的巨大变化,并详细阐述了2.0版的每个新特性。书提供了大量的实例,可帮助读者快速掌握如何在.NET平台下开发功能强大的ASP.NET应用程序。本书适合有一些基础的ASP.NET初级程序员以及准备迁移到ASP.NET 2.0的编程老手。该书与《ASP.NET 2.0入门经典(第4版)》及其早期版本,曾影响到无数国Web程序员。. ASP.NET允许Web站点为每个访问者显示独一无二的页面,而不是显示相同的静态HTML页面。ASP.NET 2.0的发布,使Web应用程序的开发又前进了一大步。这个新版本增加了大量的新功能,减少了编写常见应用程序所需的代码量。 ASP.NET 2.0新增了50多个新服务器控件,类的数量也翻了一倍,其他许多方面也有很大的变化。本书介绍了ASP.NET 2.0的每个新增特性和功能,以便读者把这些新技术应用于实践。.. 本书主要内容 ● 服务器控件的概念及其在ASP.NET开发的主导作用 ● 使用新的Master页面特性创建模板化的ASP.NET页面 ● 调试和处理错误的技术 ● 提取、创建、处理和存储XML的各种框架 ● 打包和部署ASP.NET应用程序的方法 ● 快速、逻辑地检索、更新和删除数据 本书读者对象 本书适合于有一些ASP.NET基础知识的学习者以及准备迁移到ASP.NET 2.0的有经验的程序员和开发人员。 目录回到顶部↑ 第1章 ASP.NET 2.0概述 1 1.1 简史 1 1.2 ASP.NET 2.0的目标 2 1.2.1 开发人员的效率 3 1.2.2 管理 5 1.2.3 性能和可伸缩性 8 1.3 ASP.NET 2.0的其他新特性 8 1.3.1 新的开发人员体系结构 8 1.3.2 新的编译系统 12 1.3.3 页面框架的新增内容 13 1.3.4 访问数据的新对象 15 1.3.5 新的服务器控件 15 1.4 建立ASP.NET 2.0页面的新IDE 16 1.5 小结 17 第2章 Visual Studio 2005 19 2.1 启动页面 19 2.2 文档窗口 20 2.2.1 文档窗口的视图 20 2.2.2 标记导航器 21 .2.2.3 页面标签 22 2.2.4 代码改变状态的通知 23 2.2.5 错误通知和辅助 23 2.3 工具箱 25 2.4 Solution Explorer 26 2.5 Server Explorer 28 2.6 Properties窗口 28 2.7 丢失的窗口 29 2.8 其他常见的Visual Studio操作 29 2.8.1 创建新项目 29 2.8.2 引用其他对象 30 2.8.3 使用智能标记 32 2.8.4 保存和导入Visual Studio设置 32 2.8.5 验证HTML 34 2.8.6 团队的合作 36 2.8.7 使用代码片断 36 2.9 小结 38 第3章 应用程序和页面框架 39 3.1 应用程序的位置选项 39 3.1.1 内置的Web服务器 39 3.1.2 IIS 40 3.1.3 FTP 41 3.1.4 Web站点需要FrontPage Extensions 42 3.2 ASP.NET页面结构选项 43 3.2.1 内置编码 44 3.2.2 新的后台编码模型 46 3.3 ASP.NET 2.0的Page指令 48 3.3.1 @Page 49 3.3.2 @Master 51 3.3.3 @Control 52 3.3.4 @Import 53 3.3.5 @Implements 54 3.3.6 @Register 55 3.3.7 @Assembly 55 3.3.8 @PreviousPageType 56 3.3.9 @MasterType 56 3.3.10 @OutputCache 56 3.3.11 @Reference 57 3.4 ASP.NET页面的事件

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值