ES6-2:Iterator、Proxy、Promise、生成器函数...

11-Iterator迭代器

在这里插入图片描述

  1. 打印出的是里面的内容,如果是for in打印出来的是索引,of不能遍历对象
  2. Symbol.iterator是js内置的,可以访问直接对象arr[Symbol.iterator],()调用
  3. 对象非线性一般不能迭代
    在这里插入图片描述
    在这里插入图片描述
    后两个是伪数组,但是是真迭代器接口
 ...解构赋值...展开运算符默认会调用内置迭代器,自动转换为数组形式

12-set结构

  1. 类似于数组,但成员的值都是唯一的,没有重复
  2. 与数组不同的是set没有索引
 let s1=new Set([1,2,3,4,2,1])console.log(s1);console.log([...s1]);//...展开运算符默认会调用内置迭代器,自动转换为数组形式console.log(Array.from(s1));//将类似于数组的内容转化为真数组

在这里插入图片描述

 set结构键名和键值相同,放进一个数组[11 ,11][22,22][33,33]for(let i of s2.entries()){console.log(i);}set结构没有索引只有一个值,因此结果是11 11;22 22;33 33s2.forEach((item,index)=>{console.log(item,index);})
// 数组也可以用entries// let arr=["aa","bb","cc"]// for(let i of arr.entries()){//     console.log(i);//打印出来是索引和值组成的数组// }let arr=["aa","bb","cc"]for(let [index,item] of arr.entries()){console.log([index,item]);}//[0,11][1,22][2,33]

面试题:给一个数组去重

思路:把数组里面的item都转换为字符串(因为set无法区分对象),再送到set里面进行判断有没有

arr. filter()方法里面的函数返回false会清除该数据,true会保留

let list=[1,2,2,"kerwin","kerwin",[1,2],[3,4],[1,2],
{name:"kerwin"},{age:100},{name:"kerwin"},undefined,undefined];function uni(arr){let res=new Set();return arr.filter(item=>{let id=JSON.stringify(item);if(res.has(id)){return false;}else{res.add(id);return true;}})}console.log(uni(list));

在这里插入图片描述

13-Map结构

类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。
内置Iterator迭代器对象(用for of遍历比普通对象便利)
在这里插入图片描述
在这里插入图片描述

		let o={a:1}let m2=new Map();m2.set("name","kerwin");m2.set("age",100);m2.set(o,"大连");console.log(m2);for(let i of m2){console.log(i);}console.log([...m2]);//里面得到的是数组形式// set get has delete size clearconsole.log(m1.get({a:1}));//两个对象地址不一样,undefined拿不到m2里面的值console.log(m2.get(o));//大连keys() values() entries() 返回的都是一个迭代器 用for of遍历,foreachfor(let i of m1.values()){console.log(i);}for(let i of m1.entries()){console.log(i);}for(let [index,item] of m1.entries()){console.log([index,item]);}for(let [index,item] of m1){console.log([index,item]);}console.log("======");m1.forEach((item,index)=>{console.log(item,index);})

14-Proxy代理

Proxy的作用是在对象和和对象的属性值之间设置一个代理,获取或设置该对象的值,以及实例化等多种操作,都会被拦截住,经过这一层我们可以统一处理,我们可以认为它就是”代理器”

			let s=new Set();// 只能修改代理proxy才能修改s// 代理拥有代理对象的所有东西let proxy=new Proxy(s,{// 方法内部用到了this,this应该指向实例化对象,但用了proxy代理后指向了proxy,// 因此报错需要修改this指向(也就是set里找自带方法才能去调用add()什么的)get(target,key){let value=target[key]// 判断value是不是一个方法(instanceof用于判断左边的对象是不是右边的类的实例)if(value instanceof Function){// 用于修正的方法:call apply bind前两个在修正的时候就手就调用了,而bind不会// call() apply() bind()括号里填修正的指针指向谁return value.bind(target);// target就是Set对象因此填写target}// get必须要返回东西return value},set(target,key,value){console.log("set",target,key,value);//{},name,"kerwin"if(key=="date"){box.innerHTML=value;}target[key]=value;}})

proxy本质上属于元编程非破坏性数据劫持,在原对象基础上进行了功能的衍生而又不影响对象

15-Reflect

Reflect可以用于获取目标对象的行为,它与Object类似,但是更易读,为操作对象提供了一种更优雅的方式。它的方法与Proxy是对应的。

1.代替object的某些方法

在这里插入图片描述

2.修改某些object的方法返回结果

在这里插入图片描述

3.命令式变为函数行为

在这里插入图片描述

get,set方法

let obj = {name:"kerwin"}Reflect.set(obj,"age",100)Reflect.get(obj,"name")

4.配合proxy使用:

let s=new Set();let proxy=new Proxy(s,{get(target,key){// let value=target[key]let value=Reflect.get(target,key)// 判断value是不是一个方法(instanceof用于判断左边的对象是不是右边的类的实例)if(value instanceof Function){// 用于修正的方法:call apply bind前两个在修正的时候就手就调用了,而bind不会// call() apply() bind()括号里填修正的指针指向谁return value.bind(target);// target就是Set对象因此填写target}// get必须要返回东西return value},set(target,key,value){// Reflect.set(target,key,value)Reflect.set(...arguments)//如果是一个数组,用...展开传进去}})

16-Promise对象

promise是异步编程的一种解决方案,比传统的解决方案回调函数更合理和更强大。
在这里插入图片描述

1.使用:

 // 执行器函数let pro=new Promise(function(resolve,reject){setTimeout(()=>{// resolve(1000)reject("no 1111")},1000)})// pro.then(()=>{//     // 成功//     console.log("奖金");// },()=>{//     // 失败//     console.log("没有");// })pro.then((res)=>{// 成功的函数console.log("奖金",res);}).catch((err)=>{// 失败的函数// 捕获错误console.log("没有",err);})

2.Promise对象的状态(

  • Promise对象通过自身的状态,来控制异步操作。Promise实例具有三种状态:
    异步操作未完成(pending)
    异步操作成功(fulfilled)
    异步操作失败(rejected)
  • 这三种的状态的变化途径只有两种。
    从“未完成”到“成功”
    从“未完成”到“失败”
  • 一旦状态发生变化,就不会再有新的状态变化。这也是Promise这个名字的由来,它的英语意思是“承诺”,一旦承诺成效,就不得再改变了。这也意味着,Promise实例的状态变化只可能发生一次
    因此,Promise的最终结果只有两种:
    异步操作成功,Promise实例传回一个值(value),状态变为fulfi1led。
    异步操作失败,Promise实例拋出一个错误(error),状态变为rejected。

在这里插入图片描述

3. .then.then链式调用

看第一个.then返回的结果,如果是非promise对象,会自动转换为fulfilled对象。
如果是,根据这个新的promise对象决定下一步是resolve执行then还是reject执行catch

在这里插入图片描述
在这里插入图片描述

4.promise方法:all,race

  1. Promise.all():里面两个都成功了才走.then,只要有一个失败就走.catch
    ·[pro1,pro2,pro3]数组里面的一起执行
    在这里插入图片描述
    在这里插入图片描述
  2. Promise.race(),谁先回来就执行谁相应的状态指定的回调函数
    在这里插入图片描述
    应用场景:超时处理(pro1,pro2其中一个如果执行不了就返回超时)
    在这里插入图片描述

17-Generator生成器函数

返回值就是一个遍历器
在这里插入图片描述
yield表达式返回值取决于下一个next()方法中传入的参数

<script>// 协程让函数暂停执行,需要调用next()才能往下走function* gen() {console.log(11);yield "aa"; //中文产出的意思console.log(22);yield "bb";console.log(33);//如果是return "cc"不会被遍历出来,打印出来value是“cc”,done已经变成true了,是true时就停了}let g=gen()//   g.next()//11//   g.next()//22//   g.next()//33let res1=g.next()console.log(res1);let res2=g.next()console.log(res2);let res3=g.next()console.log(res3);
//for(let i of g){//    console.log(i);//}可以一下子遍历完</script>

在这里插入图片描述
在这里插入图片描述
结果不会有”-11111“(还没有给res1赋值就遇到yield停止了)

在这里插入图片描述

18-Class语法

1.类的写法

在这里插入图片描述
在这里插入图片描述

2.getter与setter拦截属性

不能在location里面拦截后再操作自己的属性,会进入一个死循环的递归调用

class Person{constructor(name,age,id){this.name=name;this.age=age;this.ele=document.querySelector(`#${id}`);}get location(){console.log("get");}set location(data){console.log("set",data);}get html(){return this.ele.innerHTML}set html(data){this.ele.innerHTML=data.map(item=>`<li>${item}</li>`).join("")}}let obj=new Person("kerwin",100,list)obj.html=["111","222","333"]// 在控制台赋值obj.html=["111","222","333"]时候会被set拦截到,它基于html把数据映射成li节点

在这里插入图片描述

class Person{// 如果希望一个属性是静态的可以在前面加一个staticstatic myname="person类的名字";static mymethod=function(){// console.log("mymethod",this.age);在这里访问不到age,因为this指向的是Person的类名,不是实例化对象}constructor(name,age,id){this.name=name;this.age=age;}say(){console.log(this.name,this.age);}}Person.myname="person类的名字"Person.mymethod=function(){console.log("mymethod");}let obj=new Person("kerwin",100)// 访问,在控制台obj.myname访问不到,//应用场景:有些属性或方法不需要实例化对象就可以挂在类的身上(称为静态属性和静态方法),比如person都会的事// console.log(Person.myname);// Person.mymethod()

3.Class继承

1.super()方法继承调用父类constructor里面的方法
2.如果和父类方法名一样会就近原则执行,执行自己的覆盖父类,包括静态属性和静态方法
3.如果想在父级相同的方法基础上添加一些操作,需要调用super

class Student extends Person{constructor(name,age,score){super(name,age)this.score=score;}
2.如果和父类方法名一样会就近原则执行,执行自己的覆盖父类// say(){//     console.log(this.name,this.age,this.score);// }
3. 如果想在父级相同的方法基础上添加一些操作,需要调用supersay(){super.say();//调用父级的say方法console.log(this.score);}getScore(){console.log(this.score);}}let obj=new Student("kerwin",100,150)

案例:用面向对象的思路将数据传给box

<div class="box1"><h1></h1><ul></ul></div><div class="box2"><h1></h1><img src="" alt=""><ul></ul></div><script>var data1={title:"体育",list:["体育1","体育2","体育3"]}var data2={title:"综艺",url:"https//................................",list:["综艺1","综艺2","综艺3"]}class CreatBox{// 获取节点和数据constructor(select,data){this.ele=document.querySelector(select)this.title=data.title;this.list=data.list;// 初始化完后立即执行渲染页面this.render()}render(){let oh1=this.ele.querySelector("h1")let oul=this.ele.querySelector("ul")oh1.innerHTML=this.titleoul.innerHTML=this.list.map(item=>`<li>${item}</li>`).join("")}}class CreatImgBox extends CreatImgBox{constructor(select,data){super(select,data)this.imgUrl=data.urlthis.render()//再调用一遍(防止子类中的某些操作执行不到而出错)}render(){super.render()let oimg=this.ele.querySelector("img")oimg.src=this.imgUrl}}new CreatBox(".box1",data1)new CreatImgBox(".box2",data2)</script>

19-Module模块化

好处:异步加载、 私密不漏、 重名不怕(不同js包下面方法名相同的)、依赖不乱

 defer,async异步加载 不会被script标签阻塞,会继续往下面走
<script src="20-Module.js" defer></script>一直等到全部渲染完后才去执行
<script src="20-Module.js" async></script>一旦下载完渲染引擎就会中断渲染
<script src="20-1.js" type="module"></script>这种方式引入js会访问不到里面的方法

私密不漏引用方法1:

在哪用在哪引
1.在js里导出方法

// const obj={
//     A1,
//     A2
// }
// export default obj
export default {
}

2.在script里导入js中的方法

<body><script type="module">// 导入js中的方法,A1的名称可以改变,from后的链接必须加'./'import A1 from './20-1.js'</script>
</body>

重名问题解决:

import obj1 from './20-1.js'
import obj2 from './20-1.js'
console.log(obj1.test(),obj2.test())//重名不怕

导入写法2:

不加default,不能改名(这种写法区别于解构)

export {A1A2
}
import {A1A2} from './20-1.js'

重名问题解决:as表示重命名后

import {A1,A2,test as testA} from './20-1.js'
import {test as testB} from './20-2.js'
如果想一起导
import * as obj1 from './20-1.js'
import * as obj2 from './20-2.js'

导入写法3:直接在方法前加export
**写法4:**混合使用
在这里插入图片描述

20-NodeJS中的模块化

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

Linux 内核:线程的实现

在linux中的线程是轻量级线程&#xff08;Light-Weight-process&#xff0c;LWP&#xff09; 文章目录 线程概念线程实现 线程概念 线程分类 用户级线程内核级线程&#xff0c;没有用户空间&#xff0c;完全工作在内核中&#xff08;下图中没有[]的就是用户级线程&#xff09…

解析以及探讨数据库技术及其应用

一&#xff0c;引言 数据库作为信息时代的基石&#xff0c;是一种用于高效存储、管理和检索大量结构化数据的系统。它的核心价值在于提供了一种可靠且可扩展的方式&#xff0c;将复杂多样的数据按照特定结构和规则组织起来&#xff0c;以便于不同用户和应用程序进行访问和使用。…

蓝桥杯练习系统(算法训练)ALGO-957 P0703反置数

资源限制 内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 一个整数的反置数指的是把该整数的每一位数字的顺序颠倒过来所得到的另一个整数。如果一个整数的末尾是以0结尾&#xff0c;那么在它的…

Linux-等待子进程

参考资料&#xff1a;《Linux环境编程&#xff1a;从应用到内核》 僵尸进程 进程退出时会进行内核清理&#xff0c;基本就是释放进程所有的资源&#xff0c;这些资源包括内存资源、文件资源、信号量资源、共享内存资源&#xff0c;或者引用计数减一&#xff0c;或者彻底释放。…

Qt 实现的万能采集库( 屏幕/相机/扬声器/麦克风采集)

【写在前面】 之前应公司需要&#xff0c;给公司写过一整套直播的库( 推拉流&#xff0c;编解码)&#xff0c;类似于 libobs。 结果后来因为没有相关项目&#xff0c;便停止开发&维护了。 不过里面很多有用的组件&#xff0c;然后也挺好用的&#xff0c;遂开源出来一部分。…

Leetcode - 2009. 使数组连续的最少操作数

文章目录 解析排序 原地去重 滑动窗口AC CODE 题目链接&#xff1a;Leetcode - 2009. 使数组连续的最少操作数 解析 题中所述的连续数组就是一串连续的自然数&#xff0c;想问需要多少次操作能将原数组变为连续的数。 我们排序去重&#xff0c;用逆向思维想能保留的数字数目…

红外疼痛医学分会成立大会暨首届学术交流会即将盛大开幕

2024年4月7日&#xff0c;中国中医药研究促进会官网发布“关于召开红外疼痛医学分会成立大会暨首届学术交流会的第三轮通知”通知&#xff0c;大会开幕在即&#xff0c;这充分显示了官方对此次活动的高度重视。 本次大会将于 2024年4月19日至21日在重庆海兰云天海琴酒店隆重举行…

QT 使用redis ,连接并使用

一.redis安装 链接&#xff1a;https://pan.baidu.com/s/17fXKOj5M4VIypR0y5_xtHw 提取码&#xff1a;1234 1.下载得到文件夹如图 course_redis为安装包。 2.启动Redis服务 把安装包解压到某个路径下即可。 打开cmd窗口&#xff0c;切换到Redis安装路径&#xff0c;输入 r…

从人机界面设计黄金三法则视角看 ChatGPT 的界面设计的“好”与“坏”

热门文章推荐&#xff1a; &#xff08;1&#xff09;《为什么很多人工作 3 年 却只有 1 年经验&#xff1f;》&#xff08;2&#xff09;《一文掌握大模型提示词技巧&#xff1a;从战略到战术巧》&#xff08;3&#xff09;《AI 时代&#xff0c;程序员的出路在何方&#xff1…

Jenkins 安装部署

1、安装下载 官网地址&#xff1a;Jenkins 下载 war 包 1、前置环境 JDK 环境&#xff08;根据 Jenkins 版本不同&#xff0c;需要的 JDK 版本不同&#xff0c;目前需要 JDK11 的版本来支持&#xff09;Maven maven 官网下载压缩包 &#xff0c;并将其传输到服务器&#xf…

模拟多模态大模型gradio使用教程

文章目录 前言一、使用change监听demo1、代码3、网页结果显示4、输入信息结果显示 二、Button功能的demo1、代码2、结果显示3、变换参数结果显示 三、参数gr.Slider滑动demo1、代码2、结果显示3、具有下拉参数代码4、具有下拉结果显示 四、模拟多模态大模型网页demo1、代码2、界…

【机器学习300问】59、计算图是如何帮助人们理解反向传播的?

在学习神经网络的时候&#xff0c;势必会学到误差反向传播&#xff0c;它对于神经网络的意义极其重大&#xff0c;它是训练多层前馈神经网络的核心算法&#xff0c;也是机器学习和深度学习领域中最为重要的算法之一。要正确理解误差反向传播&#xff0c;不妨借助一个工具——计…

测开面经(pytest测试案例,接口断言,多并发断言)

pytest对用户登录接口进行自动化脚本设计 a. 创建一个名为"test_login.py"的测试文件&#xff0c;编写以下测试脚本 import pytest import requests# 测试用例1&#xff1a;验证登录成功的情况 # 第一个测试用例验证登录成功的情况&#xff0c;发送有效的用户名和密…

linux:du和df区别

文章目录 1. 概述2. du 命令2. df 命令3. 区别总结 1. 概述 du 和 df 都是 Linux 系统中用于查看磁盘空间使用情况的命令&#xff0c;但它们的功能和用法有所不同。 2. du 命令 du 是 “disk usage” 的缩写&#xff0c;用于显示文件或目录的磁盘使用情况。du 命令用于查看指…

Redis客户端

2.Redis客户端 安装完成Redis&#xff0c;我们就可以操作Redis&#xff0c;实现数据的CRUD了。这需要用到Redis客户端&#xff0c;包括&#xff1a; 命令行客户端图形化桌面客户端编程客户端 2.1.Redis命令行客户端 Redis安装完成后就自带了命令行客户端&#xff1a;redis-…

二分查找 -- 力扣(LeetCode)第704题

题目 https://leetcode.cn/problems/binary-search/description/ 给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一个目标值 target &#xff0c;写一个函数搜索 nums 中的 target&#xff0c;如果目标值存在返回下标&#xff0c;否则返回 -1。 示例…

计算机网络针对交换机的配置

实验 目的 交换机的基本配置&#xff0c;交换机VLAN配置 实验条件 Windows&#xff0c;Cisco packet tracer 实验 内容 交换机的基本配置&#xff0c;交换机VLAN配置 实验 过程 一、交换机的基本配置 进入特权模式 Switch>enable 进入配置模式 Switch#configure ter…

腾讯电商运营起来竟然这么简单!视频号小店操作玩法一文详解!

大家好&#xff0c;我是电商小布。 在新型电商玩法的兴起下&#xff0c;很多的平台都在电商行业内分到了一杯羹。 腾讯自然也就坐不住了&#xff0c;背靠自身的视频号平台&#xff0c;推出了视频号小店这个项目。 有很多的小伙伴想要趁着这个初期阶段&#xff0c;来加入到其…

数据结构与算法:哈希表

目录 1.哈希表和哈希 1.1.知识引入 1.2.为什么需要哈希表呢&#xff1f; 2.简易的哈希表 2.1.哈希表的基础结构 2.2.如何实现基础的哈希表 2.2.1.增 2.2.2.删 2.2.3.查 2.3.泛型编程下的哈希表 3.简易的哈希桶 1.哈希表和哈希 1.1.知识引入 哈希表&#xff08;Hash …

代码随想录-算法训练营day02【滑动窗口、螺旋矩阵】

专栏笔记&#xff1a;https://blog.csdn.net/weixin_44949135/category_10335122.html https://docs.qq.com/doc/DUGRwWXNOVEpyaVpG?uc71ed002e4554fee8c262b2a4a4935d8977.有序数组的平方 &#xff0c;209.长度最小的子数组 &#xff0c;59.螺旋矩阵II &#xff0c;总结 建议…