4、Generator、class类、继承、Set、Map、Promise

一、生成器函数Generator

1、声明generator函数

  • function* 函数名() { }
  • 调用生成器函数 需要next()
  • 返回一个generator对象,对象的原型上有一个next(),调用返回对象{value:yield后面的值,done}
function* fn() {
	console.log("我是生成器函数")
}
let item = fn()
console.log(item);//fn {<suspended>}
item.next()//我是生成器函数
image-20240311161912635

2、yield和return的区别

  • yield是暂停执行,调用next()方法继续执行
  • return结束执行

3、next()

  • yield和next()个数一样
function* fn() {
    console.log('我是生成器函数');
    yield '我是生成器函数2'
    console.log('我是生成器函数3');
    yield '我是生成器函数4'
    console.log('我是生成器函数5');
}
let item = fn()
console.log(item);//fn {<suspended>}
console.log(item.next());
//我是生成器函数 {value: '我是生成器函数2', done: false}
console.log(item.next())
//我是生成器函数3 {value: '我是生成器函数4', done: false}
console.log(item.next())
//我是生成器函数5 {value: undefined, done: true}

4、在生成器函数里面调用生成器函数,需要用yield*去调用

  • 可以传参,参数是上一个yield的返回值
function* fn_1() {
    console.log('fn_1');
}
function* fn_2() {
    console.log('fn_2');
}
function* fn_3() {
    console.log('fn_3');
}
function* fn_4() {
    yield* fn_1()
    yield* fn_2()
    yield* fn_3()
}
let it = fn_4()//fn_1  fn_2  fn_3

二、class类基本用法

1、class格式

  • static定义的只能类去调用
class 属性名 {
	//构造函数
	constructor () {
	}
	//自定义函数 
class Animal {
//构造函数
	constructor(name, age){
		this.name = name
		this.age = age
	}
	//自定义函数
	getName(value) {
        //this指向实例化对象
		console.log(this)
	}
	setName() {
		console.log(value)
		this.name = value
	}
    static getAge() {
        console.log(this)
    }
    let dog = new Animal('狗', 2)
 	console.log(dog);//Animal {name: '狗', age: 2}
	dog.setName("猫")//改名字为猫
	console.log(dog);//Animal {name: '猫', age: 2}
    // dog.getAge()//dog.getAge is not a function
    Animal.getAge()//static定义的只能类去调用
}

2、继承 extends

  • super指代父类
// 继承extends
class Cat extends Animal {
    constructor(name, age, color) {
        super(name, age)
        // 写在super下面 因为this指向问题
        this.color = color
    }
    getName_1() {
        console.log('getName_1');
        super.getName()
    }
}
let cat = new Cat('加菲', 3, 'yellow')
console.log(cat);//Cat {name: '加菲', age: 3, color: 'yellow'}
cat.getName()//Cat {name: '加菲', age: 3, color: 'yellow'}
cat.getName_1()//getName_1  Cat {name: '加菲', age: 3, color: 'yellow'}

三、set、map与模块化

1、set() 参数必须是可遍历对象,不能重复

  • set的类型是object
let set = new Set()
console.log(set);//Set(0)
console.log(typeof set);//object
let set = new Set([1, 2, 3, [1]])
console.log(set);//Set(4) {1, 2, 3, Array(1)}
  • set方法和属性

    • add()方法添加成员
let set = new Set([1, 2, 3, [1]])
set.add(4)
set.add(2)
console.log(set);//Set(5) {1, 2, 3, Array(1), 4}
  • size属性 成员的个数
console.log(set.size);//5
  • delete 删除属性 成功true 失败false
console.log(set.delete(2));//true
console.log(set);//Set(4) {1, 3, Array(1), 4}
  • clear()方法 清除所有成员
set.clear()
console.log(set);//Set(0) {size: 0}
  • has()方法 判断set结构中是否含有指定的值

    • 如果有,返回true 没有,返回false
//因为上面清空了  所以false
console.log(set.has(1));//false
  • ==enteries():==返回一个键值对的遍历器
 console.log(set.entries());//SetIterator {}
for (let [key, value] of set.entries()) {
   console.log(key);//1 3 [1] 4
   console.log(value);//1 3 [1] 4
}
  • == keys()返回键名的遍历器。==
for (let key of set.keys()) {
    console.log(key);1 3 [1] 4
}
  • values()返回键值的遍历器
for (let values of set.values()) {
    console.log(values);1 3 [1] 4
}
  • forEach()
set.forEach((item, index) => {
    // console.log(item);//1 3 [1] 4
    console.log(index);//1 3 [1] 4
})
  • 数组去重

let arr_2 = [1, 2, 3, 4, 5, 2, 3]
console.log(arr_2);//[1, 2, 3, 4, 5, 2, 3]
console.log(new Set(arr_2));// {1, 2, 3, 4, 5}
console.log(Array.from(new Set(arr_2)));// [1, 2, 3, 4, 5]
console.log([...new Set(arr_2)]);//[1, 2, 3, 4, 5]
  • WeakSet()

    • 参数必须是引用类型
    • WeakSet结构也提供了add( ) 方法,delete( ) 方法
    • has( )方法给开发者使用,作用与用法跟Set结构完全一致。
    • 不可以遍历对象 size entries keys values forEach没有
// let weak = new WeakSet([1, 2, 3])//Invalid value used in weak set
let weak = new WeakSet([{ name: "zs" }, [1, 2, 3], set])
console.log(weak);//WeakSet {Array(3), Set(4), object}

四、Map()

map声明

  • map是object类型
let map = new Map()
console.log(map);//Map(0) {size: 0}
console.log(typeof map);//object

2、参数是数组 [key,value]

let map = new Map([[1, 2], [{ name: 'zs' }], [4, 5], [{ name: "zs" }, function () { }]])
console.log(map);
//Map(4) {1 => 2, {…} => undefined, 4 => 5, {…} => ƒ}

3、方法

set(key,value) 设置键值对 添加到map里面

  • 给实例对象设置一对键值对,返回map
  • 相同的属性名 会替换之前的属性
let map = new Map([[4, 5]])
map.set(4, 6)
console.log(map);//Map(1) {4 => 6}

get()通过属性名获取 属性值

console.log(map.get(4));//6
console.log(map.get({ name: 'zs' }));
//undefined  因为地址不一样所以undefined
console.log(map.get("name"));//zs
let obj = { name: 'zs' }
let obj1 = { name: 'zs' }  
console.log(obj == obj1);//因为是引用类型 地址不一样  false

delete( )方法作用:删除指定的键值对,删除成功返回:true,否则返回:false。

console.log(map.delete(1));
console.log(map.delete({ name: 'zs' }));
console.log(map);//{'name' => 'zs', 4 => 6, {…} => ƒ, true => null}

clear( )方法,让你一次性删除所有键值对。

map.clear()
console.log(map)//Map(0) {size: 0}

has() 判断属性是否存在 有返回true 没有 false

entries( )方法作用:返回实例的键值对遍历器。

keys() 返回实例的键遍历器。

values() 返回实例的键遍历器。

forEach() 遍历

size:获取实例的成员数。

4、weakMap和map区别

key只能是引用类型的值

// key只能是引用类型的值
let wMap = new WeakMap([[{ name: "zs" }, 2]])
 console.log(wMap);//WeakMap {{…} => 2}
wMap.set([4], 5)
console.log(wMap);//WeakMap {{…} => 2, Array(1) => 5}

五、Promise对象(重点)

1、解决的问题

  • 回调地狱 回调函数的层层嵌套

2、声明Promise对象 (回调函数) (重点)

格式:

new Promise ((resolve,reject) => {})

三种状态

// 声明promise对象(回调函数)
let pro = new Promise((resolve, reject) => {
    console.log(resolve);//ƒ () { [native code] }
    $.ajax({
        url: 'https://wkt.myhope365.com/weChat/applet/course/banner/list?number=5',
        success(res) {
            resolve(res)
        }
   })
})
console.log(pro);//Promise {<pending>} 初始化等待中
  • pending 初始化等待中
  • fulfilled 成功
  • rejected 失败
    • 初始化===> 成功 初始化 ===> 失败(不可逆转)
    • pending ==> fulfilled pending ==> rejected (不可逆转的)
  • then 成功之后 resolve()
  • catch失败之后 reject()
  • pro.then( () => {} ).catch( () => {}) 链式调用
  • 下一个then方法的参数是上一个then的返回值

3、promise里面的then()是异步的

  • 用then处理操作成功,catch处理操作异常
let pro = new Promise(function (resolve, reject) {
    if (true) { //如果改为false  输出请求失败
        //调用操作成功方法
        resolve('操作成功');
    } else {
        //调用操作异常方法
        reject('操作异常');
    }
});
//用then处理操作成功,catch处理操作异常
// 下一个then方法的参数是上一个then的返回值
pro.then(requestA) //请求A成功
    .then(requestB)//上一步的结果:请求B,下一个就是你了 请求B成功
    .then(requestC)//上一步的结果:请求C,下一个就是你了  请求C成功
    .catch(requestError);
function requestA() {
    console.log('请求A成功');
    return '请求B,下一个就是你了';
}
function requestB(res) {
    console.log('上一步的结果:' + res);
    console.log('请求B成功');
    return '请求C,下一个就是你了';
}
function requestC(res) {
    console.log('上一步的结果:' + res);
    console.log('请求C成功');
}
function requestError() {
    console.log('请求失败');
}

4、promise.all() 参数是数组

  • 接受一个数组作为参数,数组里面是promise实例对象
  • 当参数中的==所有的实例对象的状态都成功(fulfilled)==的时候,才会返回
let pro1 = new Promise(function (resolve) {
    setTimeout(function () {
        resolve('实例1操作成功');
    }, 5000);
});
//创建实例pro2
let pro2 = new Promise(function (resolve, reject) {
    setTimeout(function () {
        resolve('实例2操作成功');
    }, 1000);
});
Promise.all([pro1, pro2]).then(function (result) {
    console.log(result);//['实例1操作成功', '实例2操作成功']
});

5、Promise.race()参数是数组

  • 它的参数要求跟Promise.all( )方法一样,不同的是,它参数中的promise实例,
  • 只要有一个状态发生变化(不管是成功fulfilled还是异常rejected),它就会有返回,
let pro1 = new Promise(function (resolve) {
    setTimeout(function () {
        resolve('实例1操作成功');
    }, 1000);
});
//创建实例pro2
let pro2 = new Promise(function (resolve, reject) {
    setTimeout(function () {
        reject('实例2操作失败');
    }, 2000);
});
Promise.race([pro1, pro2]).then(function (result) {
    console.log(result);
}).catch(error => {
    console.log(error);
});

image-20240311195005182

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JAVA开发常见小问题整合

文章目录 1&#xff1a;身份证工具类相关方法1.1 身份证脱敏处理 2&#xff1a;字符串补零处理(此处是JAVA类的方法&#xff0c;并无引用StrUtil)3&#xff1a;springboot前后端分离&#xff0c;后端返回json字符串带斜杠问题处理4&#xff1a;WebUploader 文件上传组件 -编辑回…

java基本认识?java跨平台原理?jdk、jre、jvm的联系?

1、java基本认识 1.1 java语言 语言&#xff1a;人与人交流沟通的方式。比如&#xff0c;你好、hello等。 计算机语言&#xff1a;人与计算机之间进行信息交流的一种特殊方式。比如&#xff0c;Java语言、C语言、C等。 1.2 java的来源 Java 是由 Sun Microsystems 公司于 …

如何正确选择国外服务器的带宽和线路呢?

国外大带宽服务器是一种提供高带宽、高速网络连接和良好稳定性的服务器&#xff0c;但在中国使用这类服务器可能涉及到违反法律法规的风险。因此我无法为你提供相关帮助。接下来和源库一起了解如何正确选择国外服务器的带宽和线路呢? 考虑目标用户的地理位置。如果目标用户主要…

计算机网络-第5章 运输层(1)

主要内容&#xff1a;进程之间的通信与端口、UDP协议、TCP协议、可靠传输原理&#xff08;停止等待协议、ARQ协议&#xff09;、TCP报文首部、TCP三大题&#xff1a;滑动窗口、流量控制、拥塞控制机制 5.1 运输层协议概述 运输层向它上面的应用层提供通信服务&#xff0c;真正…

window Zookeeper 启动;

文章目录 前言一、Zookeeper 介绍&#xff1a;二、window 使用&#xff1a;2.1 下载&#xff1a;2.2 启动2.3 连接&#xff1a; 总结 前言 本文对window Zookeeper zk 启动 进行介绍&#xff1b; 一、Zookeeper 介绍&#xff1a; ZooKeeper 是一个开源的分布式协调服务&#…

辽宁博学优晨教育:视频剪辑培训的安全正规之路

在当今数字化时代&#xff0c;视频剪辑已成为一项炙手可热的技能。为满足广大学习者的需求&#xff0c;辽宁博学优晨教育推出了一系列专业的视频剪辑培训课程。本文将重点介绍辽宁博学优晨教育的视频剪辑培训如何在保障学员安全和学习效果方面做出了卓越的努力。 一、正规资质&…

PID控制器组(完整SCL代码)

PID控制器组不是什么新概念,是在PID控制器的基础上,利用面向对象的思想对对象进行封装 批量实例化。 1、增量式PID https://rxxw-control.blog.csdn.net/article/details/124363197https://rxxw-control.blog.csdn.net/article/details/1243631972、完全增量式PID https:/…

5款好用的AI办公软件,一键轻松制作PPT、视频,提升工作效率!

众所周知&#xff0c;AI 人工智能技术已渗透到生活的方方面面&#xff0c;无论是很多人早已用上的智能音箱、语音助手&#xff0c;还是新近诞生的各种 AI 软件工具&#xff0c;背后都离不开 AI 人工智能技术的加持。 对于各类新生的 AI 软件工具&#xff0c;人们很容易「选边站…

free pascal 调用 C#程序读 Freeplane.mm文件,生成测试用例.csv文件

C# 请参阅&#xff1a;C# 用 System.Xml 读 Freeplane.mm文件&#xff0c;生成测试用例.csv文件 Freeplane 是一款基于 Java 的开源软件&#xff0c;继承 Freemind 的思维导图工具软件&#xff0c;它扩展了知识管理功能&#xff0c;在 Freemind 上增加了一些额外的功能&#x…

Java基于SpringBoot+Vue的人事管理系统,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

QML | 在QML中导入JavaScript资源、导入JavaScript资源、包含一个JavaScript 资源

01 在QML中导入JavaScript资源 JavaScript资源可以被QML文档和其他JavaScript通过相对或者绝对路径进行导入。如果使用相对路径,位置解析需要相对于包含import语句的QML文档或JavaScript资源的位置。如果JavaScript需要从网络资源中进行获取,组件的status属性会被设置为Loadi…

MinGW-w64的下载与安装

文章目录 1 下载2 安装3 配置环境变量4 验证 1 下载 官网地址&#xff1a;https://www.mingw-w64.org/github地址&#xff1a;https://github.com/niXman/mingw-builds-binaries/releases windows下载 跳转github下载 版本号选择&#xff1a;13.2.0是GCC的版本号&#xff1b…

SpringBoot中定时任务、corn表达式

SpringBoot中定时任务、corn表达式 corn表达式网站&#xff1a;https://cron.qqe2.com/ 方法上加上Scheduled(cron表达式) 启动类上加上EnableScheduling 示例 启动类上 启动类加上EnableScheduling开启定时任务。 SpringBootApplication EnableScheduling public class…

简单句,并列句【语法笔记】

1. 简单句&#xff0c;并列句本质分别是什么 2. 如何区分简单句和并列句 3. 连接词 4. 简单句的五大基本句型 5. 有连接词&#xff0c;未必都是并列句&#xff0c;这是为什么

C语言基础练习——Day05

目录 选择题 编程题 数字在升序数组中出现的次数 整数转换 选择题 1、如下程序的功能是 #include <stdio.h> int main() {char ch[80] "123abcdEFG*&";int j;puts(ch);for(j 0; ch[j] ! \0; j){if(ch[j] > A && ch[j] < Z)ch[j] ch[j] e…

《计算机网络》考研:2024/3/7 2.1.4 奈氏准则和香农定理

2024/3/7 (作者转行去干LLMs了&#xff0c;但是又想搞定考研&#xff0c;忙不过来了就全截图了呜呜呜。。。 生活真不容易。) 2.1.4 奈氏准则与香农定理

SpringCloudAlibaba 网关gateway整合sentinel日志默认路径修改

SpringCloudAlibaba 网关gateway整合sentinel 实现网关限流熔断 问题提出 今天运维突然告诉我 在服务器上内存满了 原因是nacos日志高达3G,然后将日志文件发给我看了一下之后才发现是gateway整合sentinel使用了默认日志地址导致日志生成地址直接存在与根路径下而且一下存在多…

基于SpringBoot+Vue+ElementUI+Mybatis前后端分离管理系统超详细教程(五)——多条件搜索并分页展示

前后端数据交互 书接上文&#xff0c;我们上节课通过前后端数据交互实现了分页查询和单条件搜索分页查询的功能&#xff0c;最后留了个小尾巴&#xff0c;就是把其他两个搜索条件&#xff08;email,address&#xff09;也加进来&#xff0c;实现多条件搜索并分页展示。这节课我…

【fastllm】学习框架,本地运行,速度还可以,可以成功运行chatglm2模型

1&#xff0c;关于 fastllm 项目 https://www.bilibili.com/video/BV1fx421k7Mz/?vd_source4b290247452adda4e56d84b659b0c8a2 【fastllm】学习框架&#xff0c;本地运行&#xff0c;速度还可以&#xff0c;可以成功运行chatglm2模型 https://github.com/ztxz16/fastllm &am…

升级ChatGPT4.0失败的解决方案

ChatGPT 4.0科普 ChatGPT 4.0是一款具有多项出众功能的新一代AI语言模型。以下是关于ChatGPT 4.0的一些关键特点和科普内容&#xff1a; 多模态&#xff1a;ChatGPT 4.0具备处理不同类型输入和输出的能力。这意味着它不仅可以接收文字信息&#xff0c;还能处理图片、视频等多…