【ES6知识】Iterator迭代器与 class类

news2024/12/28 20:00:05

文章目录

    • 一、Iterator迭代器
      • 1.1 基础知识概述
      • 1.2 工作原理
      • 1.3 Symbol.iterator
      • 1.4 Generator函数来实现Symbol.iterator接口
    • 二、ES6 Class 类
      • 2.1 概述
      • 2.2 ES6中的继承
      • 2.3 面向对象应用 - React

一、Iterator迭代器

1.1 基础知识概述

迭代器(Iterator)是一种接口,为各种不同的数据结构提供统一的访问机制。任何数据结构只要部署Iterator接口,就可以完成遍历操作。

ES6创造了一种新的遍历命令:for…of 循环,Iterator 主要供 for…of 使用。

原生JavaScipt案例合集
JavaScript +DOM基础
JavaScript 基础到高级
Canvas游戏开发

原生具备了 Iterator 接口的数据结构:

  • Array 数组
  • TypedArray 定型数组(一类指定元素类型的数组,不是实际的数组类型。创建的实例将在内存中创建一个数组缓冲区)
  • String 字符串
  • Arguments 参数(实参)对象
  • NodeList 节点列表
  • Set 数据结构
  • Map 数据结构

在这里插入图片描述

var arr = [1,2,3,4];
let iterator = arr[Symbol.iterator]();
 
console.log(iterator.next());  //{ value: 1, done: false }
console.log(iterator.next());  //{ value: 2, done: false }
console.log(iterator.next());  //{ value: 3, done: false }
console.log(iterator.next());  //{ value: 4, done: false }
console.log(iterator.next());  //{ value: undefined, done: true }

1.2 工作原理

  1. 创建一个指针对象,指向当前数据结构的起始位置
  2. 第一次调用对象的 next 方法,指针自动指向数据结构的第一个成员
  3. 接下来不断调用 next 方法,指针一直往后移,直到指向最后一个成员
  4. 每次调用 next 方法,返回一个包含 value 和 done 属性的对象
let obj = {
    name:"张三",
    age:18,
    arr:[1,2,3,4,"壹","贰","叁","肆"]
}

现在想要拿到 obj 对象中 arr 数组的数据。由于 Object 并没有内置 Iterator ,所以使用 for…of 遍历时,控制台报错。

let obj = {
    name:"张三",
    age:18,
    arr:[1,2,3,4,"壹","贰","叁","肆"]
}
for(value of obj){
    console.log(value)
}
//Uncaught TypeError: obj is not iterable

至于对象没有布置 iterator 接口的原因,不知道大家有没有看根据《你一生的故事》拍成的电影“降临",片中出现的外星语言是一门非线性的语言。而我们说的数组,Map 等结构中的成员都是有顺序的,即都是线性的结构,而对象,各成员并没有一个确定的顺序,所以遍历时先遍历谁后遍历谁并不确定。所以,给一个对象部署 iterator 接口,其实就是对该对象做一种线性转换。如果你有这种需要,就需要手动给你的对象部署 iterator 接口。如下:

let obj = {
    name:"张三",
    age:18,
    arr:[1,2,3,4,"壹","贰","叁","肆"],
    [Symbol.iterator](){
        let index =0
        let _this = this
          return {
             next:function(){
                 if(index < _this.arr.length){
                      return { value:_this.arr[index++], done:false}      
                 }else{
                    return {value:undefined,done:true}
                 }
          	}
        }
    }
}
for(value of obj){
  console.log(value)
}
//1 2 3 4 "壹" "贰" "叁" "肆"

可以看到,Symbol.iterator会返回一个对象,这就是一个遍历器对象,而作为遍历器对象,其必须具备的特征就是必须具备next()方法。

1.3 Symbol.iterator

在这里插入图片描述

这个符号可以是任意对象上的一个专门属性,语言机制会自动的在这个属性上寻找一个方法,这个方法会构造一个迭代器来迭代这个对象的值,这个方法就是 next 方法,… 展开和 for/of 循环会自动使用它,**我们可以自定义 Symbol.iterator 属性为任意对象值定义自己的迭代器逻辑,它将覆盖默认的迭代器。**相当于定义了一种元编程行为,提供给 Javascript 其他部分(运算符和循环结构)在处理定义的对象时使用。

  • 在 JS 中迭代器对象实现了可迭代协议,迭代器对象由 Symbol.iterator 属性的值返回。
  • Symbol.iterator 属性的值是一个函数,它返回一个迭代器对象。
  • 迭代器指的是拥有 next 方法的对象。
  • 该next方法必须返回一个带有 value 和 done 的对象。

1.4 Generator函数来实现Symbol.iterator接口

var yieldIterator = {};
yieldIterator[Symbol.iterator] = function* () {
    yield 1;
    yield 2;
    yield 3;
};
 
[...yieldIterator] // [1, 2, 3]

注意,yield* 后面跟的是一个可遍历的结构,它会调用该结构的遍历器接口。

其它调用到遍历器的操作还有解构赋值、扩展操作符、其它任何接受数组作为参数的场合

  • for…of
  • Array.from()
  • Map(), Set(), WeakMap(), WeakSet()(比如)
  • Promise.all()
  • Promise.race()

一旦当你给你的结构部署了iterator接口,那么恭喜你,你可以使用for…of来遍历你的结构了!

二、ES6 Class 类

2.1 概述

ES6之前,类和构造函数是同一个东西,并且调用的函数需要外挂(通过构造函数调用原型进行定义)。这对于面向对象语言很不友好,所以ES6中提供了类的概念。

  • class类、constructor构造器区别开来
  • class类中直接定义方法(原型方法、静态方法、实例方法)
class People {
    // 静态方法
    static sayHello(){
        return "Hello ES6继承!!";
    }

    // 通过 constructor 定义类的构造函数
    constructor(name, age, sex) {
        this.name = name;
        this.age = age;
        this.sex = sex;

        // 实例方法
        this.sayHi = function(){
            return "你好"
        }
    }

    // 原型方法,不需要 function 声明
    eat() {
        return "是人就得喝水...";
    }
}

// 通过 new 关键子定义一个类的对象
var p = new People("汉武帝", 1000, '男');

2.2 ES6中的继承

  • extends 用于继承的关键字
  • super 用于执行父类(超类、基类)中的构造函数
// 通过关键字 class 定义基类
class People {
    // 静态方法
    static sayHello(){
        return "Hello ES6继承!!";
    }

    // 通过 constructor 定义类的构造函数
    constructor(name, age, sex) {
        this.name = name;
        this.age = age;
        this.sex = sex;

        // 实例方法
        this.sayHi = function(){
            return "你好"
        }
    }

    // 原型方法,不需要 function 声明
    eat() {
        return "是人就得喝水...";
    }
}


class Doctor extends People {
    constructor(name, age, sex, clothes) {
        super(name, age, sex);

        this.clothes = clothes;
    }

    behavior() {
        return "救死扶伤";
    }
}

// 通过 new 关键子定义一个类的对象
var p = new People("汉武帝", 1000, '男');
var d = new Doctor("李时珍", 700, '男', '白大褂');

2.3 面向对象应用 - React

  • 组件化 - class

  • JSX(JS拓展版) == babel == browser.js

  • 下载 react.js , react-dom.js,browser.js ,并引入到项目中

  • script 标签类型 type = “text/babel”,且不可以省略

HTML代码:

<div id="div1"></div>

JS代码:

<script src="./libs/react.js"></script>
<script src="./libs/react-dom.js"></script>
<script src="./libs/browser.js"></script>
<script type="text/babel">
	// 自定义组件
	class Item extends React.Component{
		constructor(...args){
			super(...args)
		}
		
		render(){
			// 返回固定的值
			// return <li>123</li>
			// 返回通过属性动态传递的值
			return <li>{this.props.str}</li>
		}
	}
	
	class List extends React.Component{
		constructor(...args){
			super(...args)
		}
		
		render(){
		  	/*
		  	let aItems = [];
			for(let i = 0; i < this.props.arr.length; i++){
				aItems.push(<Item str={this.props.arr[i]}></Item>)
			}
			return <ul>
				// 数组映射
				{aItems}
			</ul>
			*/
			
			// map 优化
			let aItems = this.props.arr.map(a => <Item str={a}></Item>);
			/*			
			return <ul>
				{this.props.arr.map(a => <Item str={a}></Item>)}
			</ul>
			*/
			return <ul>
				{aItems}
			</ul>
		}
	}
	
	window.onload = function(){
		let oDiv = document.getElementById('div1');
		
		ReactDOM.render(
			// 常规标签渲染
			// <span>123</span>,
			// 自定义组件渲染
			<List arr="{['abc','def',ghi]}"></List>,
			oDiv
		)
	}
</script>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1021823.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JAVA实现PDF转图片

前言 使用wps自带的转换工具&#xff0c;需要花钱&#xff0c;不花钱的话还带水印。于是&#xff0c;使用java程序将pdf转换为图片。 代码 依赖 <dependencies><dependency><groupId>org.apache.pdfbox</groupId><artifactId>fontbox</ar…

几个国内可用的强大的GPT工具

前言&#xff1a; 人工智能发布至今&#xff0c;过去了九个多月&#xff0c;已经成为了我们不管是工作还是生活中一个重要的辅助工具&#xff0c;大大提升了效率&#xff0c;作为一个人工智能的自然语言处理工具&#xff0c;它给各大行业的提供了一个巨大的生产工具&#xff0c…

Vue Grid Layout -️ 适用Vue.js的栅格布局系统,在vue3+上使用

文章目录 1、官网简介2、在vue3中使用1)、需要导入vue3支持的版本插件2)、在mian.js里引入&#xff1a;3)、在组件中使用 3、layout布局的计算逻辑4、 gridLayout 的属性 该栅格系统目前对 vue2 的支持是最好的&#xff0c;vue3 是需要用插件支持的&#xff0c;会在小节详细讲解…

目标检测:Edge Based Oriented Object Detection

论文作者&#xff1a;Jianghu Shen,Xiaojun Wu 作者单位&#xff1a;Harbin Institute of Technology Shenzhen 论文链接&#xff1a;http://arxiv.org/abs/2309.08265v1 内容简介&#xff1a; 1&#xff09;方向&#xff1a;遥感领域中的目标检测技术 2&#xff09;应用&…

肖sir__mysql之存储__012

mysql之存储 一、存储 1、什么是存储过程 定义&#xff1a;存储过程就是实现某个特定功能的sql语句的集合&#xff0c;编译后的存储过程会保存在数据库中&#xff0c;通过存储过程的名称可以反复的调用执行。 2、存储过程的优点? (1)存储创建后&#xff0c;可以反复的调用&am…

液晶LCD显示驱动VK2C23可支持最大416点(52SEGx8COM)的LCD屏提供LQFP48、LQFP64的封装

VK2C23是一个点阵式存储映射的LCD驱动器&#xff0c;可支持最大224点&#xff08;56SEGx4COM&#xff09;或者最大416点&#xff08;52SEGx8COM&#xff09;的LCD屏。单片机可通过I2C接口配置显示参数和读写显示数据&#xff0c;也可通过指令进入省电模式。其高抗干扰&#xff…

Zoho Projects登顶福布斯2023年项目管理工具排行榜

Zoho Projects一款集成度较高的项目管理工具&#xff0c;近日入选福布斯2023年十佳项目管理工具榜单。作为一款为中小企业量身定制的解决方案&#xff0c;Zoho Projects以其卓越的功能和性价比&#xff0c;赢得了市场的广泛认可。 在当今竞争激烈的市场环境中&#xff0c;选择一…

F.cross_entropy的使用困惑--终结

1.由于按照cross_entropy的计算公式&#xff0c;F.cross_entropy(outs,label)这里面的outs和label的应该都是batch_size * one_hot_vec的形状&#xff0c;但是&#xff0c;这个函数呢&#xff0c;第二个label只要是batch_size * scalar即可&#xff0c;那个scalar就是index的位…

如果你用Markdown写公众号文章,试试我做的在线转换神器

大家好&#xff0c;我希望向大家介绍一款我最近开发的实用工具——"MarkdownConvert"&#xff0c;它能够以极简和高效的方式将Markdown文本转换为微信公众号所支持的HTML格式。它是我基于一个开源项目改进优化了页面&#xff0c;增加了自己喜欢的文章主题。 先聊聊这…

微信小程序传参的五种方式

文章目录 前言一、URL参数传递1.api跳转2.组件跳转 二、Storage本地存储三、全局变量globalData四、页面跳转时传参五、页面栈传参总结结语 前言 大家好&#xff0c;今天和大家分享一下微信小程序页面之间传参的五种方式&#xff0c;这个的话也是有人问了我一嘴&#xff0c;然…

Python进阶复习-文件与异常

目录 文件打开文件路径打开模式字符编码 文件读取逐行读取读取所有行 文件写入既读又写两种数据存储结构csv文件json文件 程序异常Exception万能捕捉 文件打开 文件路径 完整路径 with open("E:\hello.txt", "r", encoding"UTF-8") as file:c…

Socks5与HTTP的区别与应用场景

在网络访问中&#xff0c;代理服务器扮演着重要角色&#xff0c;用于保护用户隐私、提高访问速度等。Socks5代理和HTTP代理是两种常见的代理协议&#xff0c;它们在功能和应用场景上有所不同。本文将深入解析Socks5代理和HTTP代理的区别&#xff0c;帮助您更好地了解并选择适合…

Linux 信号捕捉函数 signal sigaction

signal函数 #include <signal.h> typedef void (*sighandler_t)(int); sighandler_t signal(int signum, sighandler_t handler); 功能&#xff1a;设置某个信号的捕捉行为 参数&#xff1a; -signum&#xff1a;要捕捉的信号 handler&#xff1a;对捕捉到的信号怎么处理…

安装了多个版本VS导致无法安装vsix

如&#xff0c;先后安装了VS2015、VS2019&#xff0c;现在想给VS2015安装一个qt-vsaddin插件&#xff0c;运行vsix报错 “View Install Log”里显示 2023/9/19 10:03:46 - 正在搜索适用的产品... 2023/9/19 10:03:46 - 找到的已安装产品 - Microsoft Visual Studio Ultimate …

中标麒麟--国产操作系统-九五小庞

那么&#xff0c;我国国产操作系统现状到底如何呢&#xff1f; 自 1999 年徐冠华部长一语点破我们的产业软肋之后&#xff0c;国产操作系统起步于国家“七五”计划期间&#xff0c;目前国产操作系统均是基于Linux内核进行的二次开发&#xff0c;中国国产操作系统进入Linux元年…

多线程详解(上)

文章目录 一、线程的概念1&#xff09;线程是什么2&#xff09;为甚要有线程&#xff08;1&#xff09;“并发编程”成为“刚需”&#xff08;2&#xff09;在并发编程中, 线程比进程更轻量. 3&#xff09;线程和进程的区别 二、Thread的使用1&#xff09;线程的创建继承Thread…

【随想】每日两题Day.7

题目&#xff1a;面试题 02.07.链表相交 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交&#xff1a; 题目数据 保证 整个链式结构中不存在环。 …

Excel中的宏、VBA

一、宏是什么&#xff1f; EXCEL MACRO 是一种记录和播放工具&#xff0c;它仅记录您的 Excel 步骤&#xff0c;并且宏将根据需要播放任意多次。 VBA 宏可自动执行重复任务&#xff0c;从而节省了时间。 这是一段可在 Excel 环境中运行的编程代码&#xff0c;但您无需成为编码…

EtherCAT 总线型 4 轴电机控制卡解决方案

 技术特点  支持标准 100M/s 带宽全双工 EtherCAT 总线网络接口及 CoE 通信协议一 进一出&#xff08;RJ45 接口&#xff09;&#xff0c;支持多组动态 PDO 分组和对象字典的自动映射&#xff0c;支持站 号 ID 的自动设置与保存&#xff0c;支持 SDO 的电机参数设置与…

设计模式之解析器(Interpreter)的C++实现

1、解析模式的提出 在软件开发的过程中&#xff0c;需要实现一种需求&#xff0c;该需求的结构稳定&#xff0c;但是需求的业务内容会频繁变化&#xff0c;如果使用普通语法实现需求&#xff0c;需要经常更新代码&#xff0c;不具有灵活性。可以使用解析器模式解决实现该类需求…