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 = namethis.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 functionAnimal.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] 4console.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] 4console.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

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

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

相关文章

Linux-网络编程报错分析

1【UDP】通信 【No route to host】&#xff1a;没有连接主机的路由 原因分析&#xff1a; 1.没有配置好默认网关地址&#xff0c;计算机上的路由表找不到到目标ip的路由。 解决方法&#xff1a;检查网络配置 2. 解决方法&#xff1a; 3. 解决方法&#xff1a;

22 Dytechlab Cup 2022C. Ela and Crickets(思维、找规律、模拟)

思路就是找规律 可以发现&#xff0c;当拐点在角落时的情况和不在角落的情况是不同 当拐点在角落时&#xff0c;只有目标点的横纵坐标其中的一个和它相同时&#xff0c;这时才可能到达。 否则&#xff0c;我们就简单的例子可以看一下&#xff0c;当一个 2 ∗ 2 2*2 2∗2的矩阵的…

使用网盘不限速,云开发者都用这一招

在现实世界里&#xff0c;很多现实里的场景和物品都逐渐“云”化。 最直观的一个解释&#xff0c;就是我们几乎人人都在使用网盘来存储数据、文档、音视频和各类安装包。 用网盘是挺方便的。但有个让人头疼的问题&#xff0c;就是很多免费网盘对上传下载速度限制得厉害。 比…

猫咪挑食怎么治?排行榜靠前适口性好的主食冻干推荐

在如今&#xff0c;养猫人士几乎都将自己的小猫咪视作珍宝&#xff0c;宠溺有加。但宠爱过度有时也会导致猫咪养成挑食的坏习惯。猫咪挑食怎么治呢&#xff1f;今天&#xff0c;我要分享一个既能让猫咪不受苦&#xff0c;又能纠正挑食问题的方法。 一、为什么猫会挑食呢&#x…

CSS 文档流

是指页面上的元素在摆放的时候所占用的空间&#xff0c;也泛指页面元素放置的位置。 块元素&#xff1a;比如li标签或者h1这种&#xff0c;都是默认自上而下摆放的。内联标签&#xff1a;如果是span标签或者strong标签&#xff0c;它是从左到右进行摆放的。 有些场景并非得从…

数据结构绪论

数据元素&#xff1b;数据项&#xff1b;组合项 数据对象 有相同性质的数据元素就属于同一个数据对象&#xff1b; 而数据结构则要求数据元素之间存在特定的关系&#xff01; 线性数据结构&网状数据结构 数据结构这门课关注的是数据元素之间的关系&#xff0c;和对这些…

软件测试面试需要准备什么?面试有什么技巧?看完面试轻松解决

前言 无论是在校招还是社会企业招聘中&#xff0c;应聘者总是要经过层层的考核才能被聘用。然而&#xff0c;在招聘时&#xff0c;设置的编程以及非技术面试问题&#xff0c;真的有必要吗&#xff1f;如此就能考核出一位开发者的真实水平&#xff1f; 说到底就是考验你的技术以…

kibana新增查看更新删除es中的数据

登录kibana&#xff0c;打开开发工具 写入数据 PUT test20240311/person/1 {"name": "张三","mobile":"13011111111" } 查询数据 GET /test20240311/person/_search {"query": {"term": {"mobile": {…

docker安装各种组件

一 docker基本命令 镜像操作 ① 列举镜像 docker images ② 搜索镜像&#xff08;以jdk为例&#xff09; docker search jdk ③ 下载镜像 docker pull java ④ 查看所有镜像 docker images ⑤ 启动镜像&#xff08;以jdk8为例&#xff09; docker run -it --name jdk…

鸿蒙实战开发学习:【HiView插件开发】

概述 Hiview是一个跨平台的终端设备维测服务集&#xff0c;其中是由插件管理平台和插件实现的各自功能构成整套系统。 本文描述了hiview插件开发的全部流程。 插件的概念 整节部分包括了插件的概念&#xff0c;事件源的概念&#xff0c;流水线的概念等基本概念 插件的定义 …

低功耗高端蓝牙智能跳绳解决方案

一、方案概述 跳绳运动作为轻量、燃脂、便捷的运动之一&#xff0c;拥有庞大的人群基础。在这样的趋势下&#xff0c;智能跳绳的智能化及精细化也就顺理成章。 芯联深入智能运动健康器材市场&#xff0c;最新开发了蓝牙智能跳绳方案&#xff0c;采用双霍尔高精准计数方案&…

Nodejs 18.19.0 基本环境搭建(无版本管理)

简介 记录一次安装Nodejs的过程, 及设置install 安装路径等… 基本安装及设置步骤 1. 下载Nodejs并安装 NodeJs 18.19.0 LTS Windows安装msi, 下载后安装在自己想要的路径, 例如 D:\Softwares\Dev_Tools\nodejs cmd 中输入 nodejs version 可以查看版本 2. 设置 npm config ls…

Java17 --- SpringCloud初始项目创建

目录 一、cloud项目创建 1.1、项目编码规范 1.2、注解生效激活 1.3、导入父工程maven的pom依赖 二、创建子工程并导入相关pom依赖 2.1、相关配置文件 2.1.1、数据库配置文件内容 2.1.2、自动生成文件配置内容 三、创建微服务8001子工程 3.1、导入相关pom依赖 3.…

全面认识计算机操作系统(二)

目录 一、操作系统的诞生 相关概念&#xff1a; 1. 手工操作阶段 2. 脱机输入 / 输出阶段 &#xff08;1&#xff09;脱机输入技术 &#xff08;2&#xff09;脱机输出技术 3. 单道批处理阶段 4. 多道批处理阶段 5. 分时技术产生 6. 实时系统产生 二、现代操作系统的…

植物病害识别:YOLO水稻病害识别数据集(3000多张,3个类别,yolo标注)

YOLO水稻病害识别数据集&#xff0c;包含细菌性枯萎病&#xff0c;水稻瘟疫&#xff0c;褐斑病3个常见病害类别&#xff0c;共3000多张图像&#xff0c;yolo标注完整&#xff0c;可直接训练。 适用于CV项目&#xff0c;毕设&#xff0c;科研&#xff0c;实验等 需要此数据集或…

隐私与创新的交汇点:Partisia Blockchain 重绘技术蓝图

正当我们在这个信息泛滥的时代寻找稳固的信任锚点时&#xff0c;区块链技术应运而生&#xff0c;然而&#xff0c;正如任何科技革命都会遇到的挑战&#xff0c;一个重要的问题摆在了我们面前&#xff1a;如何在不牺牲个人隐私的前提下&#xff0c;享受区块链技术带来的好处&…

ChatGLM:CPU版本如何安装和部署使用

前段时间想自己部署一个ChatGLM来训练相关的物料当做chatgpt使用&#xff0c;但是奈何没有gpu机器&#xff0c;只能使用cpu服务器尝试使用看看效果 我部署的 Chinese-LangChain 这个项目&#xff0c;使用的是LLM&#xff08;ChatGLM&#xff09;embedding(GanymedeNil/text2vec…

深克隆和浅克隆

1.克隆 克隆是指创建对象的一个副本&#xff0c;使副本具有与原始对象相同的属性和状态。 而克隆又分深克隆和浅克隆。 2.浅克隆 浅克隆&#xff1a;只会把原对象中类型为值的属性复制一份&#xff0c;然后引用数据类型就把它们在内存中的地址复制过去 比如一个对象有 public …

我终于解决MathPage.wll文件找不到问题|(最新版Word上亲测)运行时错误,53’: 文件未找到:athPage.WLL

1、问题症状&#xff1a; 运行时错误&#xff0c;53’: 文件未找到:athPage.WLL 2、 解决方案 第一步 首先我们要先找到MathType安装目录下MathPage.wll文件&#xff0c;直接在此电脑中搜索MathPage.wll&#xff0c;找到文件所在位置。 第二步 打开Word文件&#xff0c…

Matplotlib进阶学习:基于Matplotlib实现设置Times New Roman字体

Matplotlib进阶学习&#xff1a;基于Matplotlib实现设置Times New Roman字体 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f4…