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

news2024/9/24 11:33:13

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 33
        s2.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 clear
        console.log(m1.get({a:1}));//两个对象地址不一样,undefined拿不到m2里面的值
        console.log(m2.get(o));//大连

keys() values() entries() 返回的都是一个迭代器 用for of遍历,foreach
        for(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()//33
    let 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{
            // 如果希望一个属性是静态的可以在前面加一个static
            static 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. 如果想在父级相同的方法基础上添加一些操作,需要调用super
            say(){
                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.title
                oul.innerHTML=this.list.map(item=>`<li>${item}</li>`).join("")

            }
        }
        class CreatImgBox extends CreatImgBox{
            constructor(select,data){
                super(select,data)
                this.imgUrl=data.url
                this.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.coloradmin.cn/o/1596056.html

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

相关文章

QT、ffmpeg视频监控分屏

1、支持分屏&#xff08;4&#xff0c;6&#xff0c;8&#xff0c;9&#xff0c;13&#xff0c;16&#xff0c;25&#xff0c;32&#xff0c;64&#xff09;切换 2、支持拖拽效果 3、支持播放mp4&#xff0c;rtmp等 4、本人亲测支持播放32路&#xff0c;64路没做测试 5、支持读…

12.文件浏览器

子程序参数的使用 1.可空的用法&#xff1b;表示这个参数不写也行。 2.如何使用递归 3.需要注意的事 递归的子程序必须有个退出的条件 注意区分递归和循环&#xff0c;不要混用 流程&#xff1a; 1.插入按钮&#xff0c;输入输出调试文本&#xff08;“按钮被单击”&…

Windows本地部署Ollama+qwen本地大语言模型Web交互界面并实现公网访问

文章目录 前言1. 运行Ollama2. 安装Open WebUI2.1 在Windows系统安装Docker2.2 使用Docker部署Open WebUI 3. 安装内网穿透工具4. 创建固定公网地址 前言 本文主要介绍如何在Windows系统快速部署Ollama开源大语言模型运行工具&#xff0c;并安装Open WebUI结合cpolar内网穿透软…

三次握手与四次挥手到底是怎么回事?

三次握手和四次挥手是TCP/IP协议中建立和断开连接的关键步骤&#xff0c;它们是保证可靠通信的重要机制。这里将探讨这两个概念&#xff0c;并解释它们背后的原理。 三次握手 三次握手用于建立TCP连接&#xff0c;它由客户端和服务器之间发送的三个报文组成&#xff1a; 第一次…

竞赛 基于Django与深度学习的股票预测系统

文章目录 0 前言1 课题背景2 实现效果3 Django框架4 数据整理5 模型准备和训练6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **基于Django与深度学习的股票预测系统 ** 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff…

怎么使用JMeter进行性能测试?

一、简介 JMeter是Apache软件基金会下的一款开源的性能测试工具&#xff0c;完全由Java开发。它专注于对我们应用程序进行负载测试和性能测量&#xff0c;最初设计用于web应用程序&#xff0c;现在已经扩展到其他测试功能&#xff0c;比如&#xff1a;FTP、Database和LDAP等。…

【题目】【信息安全管理与评估】2022年国赛高职组“信息安全管理与评估”赛项样题5

【题目】【信息安全管理与评估】2022年国赛高职组“信息安全管理与评估”赛项样题5 第一阶段竞赛项目试题 本文件为信息安全管理与评估项目竞赛-第一阶段试题&#xff0c;第一阶段内容包括&#xff1a;网络平台搭建与设备安全防护。 本次比赛时间为180分钟。 介绍 竞赛阶段…

Github 2024-04-09 Python开源项目日报 Top10

根据Github Trendings的统计,今日(2024-04-09统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目10Vue项目1JavaScript项目1系统设计指南 创建周期:2507 天开发语言:Python协议类型:OtherStar数量:241693 个Fork数量:42010 次…

广西有多少家建筑模板企业?

作为一个建筑大省,广西地区建筑模板企业数量可谓不少。这些企业规模大小不一,生产能力和产品质量参差不齐。然而,在这些企业中,有一家脱颖而出,备受业内推崇,那就是贵港市能强优品木业有限公司。 能强优品木业有限公司是广西知名的建筑模版生产厂家,拥有25年的丰富生产经验。公…

弹性 MapReduce(EMR)

一.产品简介 1产品概述 E腾讯云 EMR 提供基于云服务器&#xff08;CVM&#xff09;和容器服务&#xff08;TKE&#xff09;两种部署运行方式&#xff1a; 2.Agent 的安装目录 Linux 安装目录是/usr/local/qcloud/stargate和/usr/local/qcloud/monitor CoreOs 安装目录是/va…

蓝桥杯之注意事项

1.特殊求解的地方 2.一些数学公式 比如二叉树求全深度数值那道题 3.掌握有关库函数 #include<algorithm> 包含sort&#xff08;&#xff09;函数【排列函数】C sort()排序详解-CSDN博客&#xff0c;next_permutation()函数【求解全排列问题】求解数组大小sizeof(arr…

如何在Windows使用固定公网地址SSH远程访问本地Archcraft系统

文章目录 1. 本地SSH连接测试2. Archcraft安装Cpolar3. 配置 SSH公网地址4. 公网远程SSH连接小结 5. 固定SSH公网地址6. SSH固定地址连接 Archcraft是一个基于Arch Linux的Linux发行版&#xff0c;它使用最简主义的窗口管理器而不是功能齐全的桌面环境来提供图形化用户界面。 C…

BPM业务流程管理的前世今生

BPM的概念与起源 BPM&#xff0c;即业务流程管理&#xff0c;是一种以规范化的构造端到端的卓越业务流程为中心&#xff0c;以持续的提高组织业务绩效为目的的系统化方法&#xff0c;是一种管理原则。 BPM通常也代指BPMS (Business Process Management Suite)&#xff0c;是实…

正则表达式---【Python版】

目录 前言 一.正则表达式概括 1.1简介 1.2使用场景 二.正则表达式语法 2.1基本匹配 2.2元字符 2.2.1点运算符. 2.2.2字符类[] 2.2.3否定字符类 2.2.4*号 2.2.5号 2.2.6&#xff1f;号 2.2.7{}号 2.2.8()号 2.2.9|或运算 2.2.10转码特殊字符\ 2.2.11^和$ 2.3简…

CSS实现三栏自适应布局(两边固定,中间自适应)

绝对定位的元素会脱离文档流&#xff0c;它们是相对于包含块&#xff08;通常是最近的具有相对定位、绝对定位或固定定位属性的父元素&#xff09;进行定位的。当你把一个绝对定位的元素的高度设置为100%时&#xff0c;它会相对于其包含块的高度来确定自己的高度。如果包含块是…

SecureCRT自动保存串口打印的日志到文件

点击Options->Edit Default Session->Log File 在Log file name中输入X\Log\%H\%Y-%M-%D_%h-%m%s.log X根据自己的盘符做修改 如果遇到log文件无法自动保存&#xff1a;点击File选中Log Session

MySQL8.0.36-社区版:错误日志(3)

mysql有个错误日志&#xff0c;是专门记录错误信息的&#xff0c;这个功能默认是开启的 一般都是在/var/log/mysqld.log 日志中存放 1.错误日志的位置 首先我们使用命令去查看一下&#xff0c;这个错误日志文件究竟在哪 进入到mysql中&#xff0c;使用命令 show variables…

Nvidia DGX 系统分析和探讨

NVIDIA DGX 互联结构 NVIDIA DGX 是Nvidia 推出的turnkey 解决方案&#xff0c;其中按照组合关系: DGX GB200 System: NVL72 36 Nvidia Grace CPU72 BlackWell GPU每台机柜包含18 个GB200 计算节点&#xff0c;每个节点包含2 个GB200s9 个NVSwitches Tray 节点&#xff0c;每个…

从AdTech转战Martech,驰骛科技的PaaS之路

中国最早的Adtech公司之一&#xff0c;在被全资收购后&#xff0c;其创始团队又创立了一家Martech公司。赛道的变更也从侧面反映出中国营销技术市场的发展轨迹。 驰骛科技创始团队来自易传媒核心团队&#xff0c;驰骛科技创始人程华奕是易传媒创始人兼CTO&#xff0c;是中国最早…

UE4 避免布料模拟重置后抖动

问题&#xff1a;每次设置带布料模拟的布料新位置&#xff0c;就会发生突然的抖动 解决办法&#xff1a;给“布料混合权重”或“布料最大距离缩放”K帧&#xff0c;参考数值为0.2—1&#xff08;红框内的值都试过无法解决&#xff09;