Symbol()和迭代器生成器

news2024/11/17 21:48:15

目录

1、Symbol()

2、迭代器生成器

执行流程

模拟生成器函数

for  of 遍历迭代选择器

yield  *

Generator函数应用


1、Symbol()

Symbol表示独一无二的值

   const s1 = Symbol('a')
      const s2 = Symbol('a')
      console.log(s1 === s2) // false
      console.log(typeof s1) // 'symbol'

应用场景-产生独一无二的值

 let symbol=Symbol()
        o[symbol]=100
        console.log(o)//{a: 20, b: 30, c: 40, Symbol(): 100}

2、迭代器生成器

Generator是一个特殊的函数,执行它会返回一个lterator对象。通过遍历迭代器, Generator函数运行后会返回一个遍历器对象,而不是普通函数的返回值。

 普通函数一旦执行 函数体从上往下依次执行

   function f(){
            console.log(1)//1
            console.log(2)//2
            console.log(3)//3
        }
        f()

生成器函数(generator)----生成迭代器(Iterator)的函数,配合yield关键字来控制代码执行流程

next(参数) 赋值给上一次yield

yield后面的表达式作为本次next返回值的value属性值

it.next()  执行下一步

   function* go(str){
            // console.log(1)
            let a=yield str
            // console.log(2)
            let b=yield a
            // console.log(3)
            return b
        }
        const it=go('hello')// it拿到生成器函数返回值
        console.log(it)//go {<suspended>}
        const r1=it.next(1)
        console.log(r1)//{value: 'hello', done: false}
        const r2=it.next(2)
        console.log(r2)//{value: 2, done: false}
        const r3=it.next(3)
        console.log(r3)//{value: 3, done: true}

执行流程

  function* test(num){
            let x=3*(yield num+1)
            let y=yield x/3
            return x+y+num
        }
        let n=test(3)
        console.log(n.next())//{value: 4, done: false}
        console.log(n.next(5))//{value: 5, done: false}
        console.log(n.next(8))//{value: 26, done: true}
        
        /* test(3) 拿到迭代器,3传给num
        第一次 n.next() ,函数开始执行,遇到第一个yield停下来,把yield后面的表达式值作为next方法的返回值中value属性值
        第二次 n.next(5) 函数继续执行,5赋值给上一次yield整体, x =  3 *  5,又遇见yield  5 ,把yield后面的表达式值作为next方法的返回值中value属性值
        第三次 n.next(8) 函数继续执行 8赋值给上一次yield整体,y = 8 ,返回15+8 + 3 ,函数执行完毕,把返回值赋值给next方法的返回值中value属性值*/

模拟生成器函数

   //模拟生成器函数
        function buy(books) {
            let i = 0
            return {
                next() {
                    let done = i === books.length ? true : false
                    let value = done ? undefined: books[i++]
                    return {
                        value,
                        done,
                    }
                },
            }
        }

        // function* buy(books){

        //     // yield books[0]
        //     // yield books[1]
        //     for(let i=0;i<books.length;i++){
        //         yield books[i]
        //     }
        // }
        const it = buy(['js', 'vue'])
        console.log(it.next())//{value: 'js', done: false}
        console.log(it.next())//{value: 'vue', done: false}
        console.log(it.next())//{value: undefined, done: true}

for  of 遍历迭代选择器

<script>
        function* demo(){
            yield 1
            yield 2
            yield 3
            yield 4

        }
        const it =demo()
        for(let k of it){
            console.log(k)//1,1,3,4
        }
    </script>

yield  *

yield  *可以在Generator函数内部调用一个Generator函数
 

   <script>
          function* test() {
            yield 'a ';
             yield 'b ';
        }
        function* test1() {
            yield 'x ';
            yield* test();
            yield 'y'
        }
        for (let v of test1()) {
            console.log(v);
        }
//相当于
        // function* test() {
        //     yield 'a ';
        //     yield 'b ';
        // }
        // function* test1() {
        //     yield 'x ';
        //     for (let v of test()) {
        //         console.log(v);
        //     }
        //     yield 'y ';
        // }
        // for (let v of test1()) {
        //     console.log(v);
        // }
    </script>

Generator函数应用

需求:实现点击一下切换图片,两张图片来回切换

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        img{
            width: 200px;
            height: 200px;
        }
    </style>
</head>
<body>
    <img src="./1.jpg" alt="">
    <button>切换</button>
    <script>
        const Img=document.querySelector('img')
        const btn=document.querySelector('button')
        //以前的方法
        // let flag=true
        // btn.addEventListener('click',function(){
        //     if(flag){
        //         Img.src='./1.jpg'
        //         flag=false
        //     }else{
        //         Img.src='./2.jpg'
        //         flag=true
        //     }
        // })

        //generator应用
        function* change(){
            while(true){//来回切换是一个死循环
                yield ( Img.src='./1.jpg')
                yield ( Img.src='./2.jpg')
            }
        }
        const it=change()
        btn.addEventListener('click',function(){
            it.next()
        })
    </script>
</body>
</html>

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

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

相关文章

PCB走线宽度与电流的关系表

在1 oz./sq. ft.铜重量时将温度上升限制在10C。这应该可以让您大致了解如何调整PCB中的走线尺寸。 电流&#xff08;A&#xff09;走线宽度&#xff08;mil&#xff09;1102303504805110615071808220926010300 上表适用于许多通常采用标准工艺生产的PCB&#xff0c;其目标是非…

SHAP(三):在解释预测模型以寻求因果见解时要小心

SHAP&#xff08;三&#xff09;&#xff1a;在解释预测模型以寻求因果见解时要小心 与 Microsoft 的 Eleanor Dillon、Jacob LaRiviere、Scott Lundberg、Jonathan Roth 和 Vasilis Syrgkanis 合作撰写的关于因果关系和可解释机器学习的文章。 当与 SHAP 等可解释性工具配合…

STM32CubeMx+MATLAB Simulink点灯程序

STM32CubeMxMATLAB点灯程序 ✨要想实现在MATLAB Simulink环境下使用STM32&#xff0c;前提是已经搭建好MATLAB环境并且安装了必要的Simulink插件&#xff0c;以及对应的STM32支持包。 &#x1f33f;需要准备一块所安装支持包支持的STM32开发板. &#x1f516;具体支持包详情页…

uniapp uni-popup组件在微信小程序中滚动穿透问题

起因 在微信小程序中使用uni-popup组件时&#xff0c;出现滚动穿透&#xff0c;并且uni-popup内部内容不会滚动问题。 解决 滚动穿透 查阅官方文档&#xff0c;发现滚动穿透是由于平台差异性造成的&#xff0c;具体解决可以参照文档禁止滚动穿透 <template><page-…

Chrome 拓展开发系列:什么是 Chrome 拓展?

文章目录 Chrome 拓展&#xff08;Chrome Extension&#xff09;是什么为什么使用 Chrome 拓展&#xff1f;个性化浏览体验提高工作效率改善隐私和安全创新新功能 发展历史2009 年&#xff1a;初版发布2010 年&#xff1a;稳步增长2013 年&#xff1a;Chrome App 和扩展合并201…

企业存货库存综合分析全流程图

上期我们谈到了 诊断存货管理的4大维度&#xff0c;今天我们进一步全方位、全周期的分析企业内存货的问题。 企业存货是企业用于生产或销售的货品&#xff0c;是企业价值增值变现的载体&#xff0c;但是如果一旦没有产生交易&#xff0c;存货就很有可能带来损失。存货伴随着企业…

反序列化漏洞详解(一)

目录 一、php面向对象 二、类 2.1 类的定义 2.2 类的修饰符介绍 三、序列化 3.1 序列化的作用 3.2 序列化之后的表达方式/格式 ① 简单序列化 ② 数组序列化 ③ 对象序列化 ④ 私有修饰符序列化 ⑤ 保护修饰符序列化 ⑥ 成员属性调用对象 序列化 四、反序列化 …

深度学习今年来经典模型优缺点总结,包括卷积、循环卷积、Transformer、LSTM、GANs等

文章目录 1、卷积神经网络&#xff08;Convolutional Neural Networks&#xff0c;CNN&#xff09;1.1 优点1.2 缺点1.3 应用场景1.4 网络图 2、循环神经网络&#xff08;Recurrent Neural Networks&#xff0c;RNNs&#xff09;2.1 优点2.2 缺点2.3 应用场景2.4 网络图 3、长短…

ZeroTier外网访问实验室Linux服务器

ZeroTier外网访问实验室Linux服务器 1、在ZeroTier上创建一个自己的Network 进入ZeroTier的官网https://www.zerotier.com/注册一个账号 注册完之后登录进去&#xff0c;创建自己的Network 创建完之后来到IPv4的分配管理&#xff0c;选择主机位只有后8位的IP&#xff0c;才能…

Windows安装Mysql Workbench及常用操作

Mysql Workbench是mysql自带的可视化操作界面&#xff0c;功能是强大的&#xff0c;但界面和navicat比&#xff0c;就是觉得别扭&#xff0c;但其实用惯了也还好&#xff0c;各有特色吧。这里记录一下常用的操作。 官方手册&#xff1a;MySQL Workbench 一、安装 1. 下载 官方…

C++可表示的数(数组前面2个数的和)

void 可表示的数&#xff08;数组前面2个数的和&#xff09;() {int aa[]{1,2,3,4,5,6,7,8,9}, j 0, z 1, jj z, n 9, ge 0;string a "";while (j < n)//缘由https://bbs.csdn.net/topics/396063706?page1#post-410898529{if (jj < n)if (aa[j] aa[z] …

深入浅出强化学习

目录 一、强化学习的概念 二、强化学习的特点 三、强化学习的训练过程 一、强化学习的概念 强化学习是一种机器学习方法&#xff0c;旨在教会算法如何通过与环境的交互来进行学习和决策。与传统的监督学习和无监督学习不同&#xff0c;强化学习侧重于学习与奖励和惩罚&#…

OSI七层模型的前三层

开发中我们常见的网络设计和网络排查等&#xff0c;用到的网络层一般是tcp/ip第四层&#xff0c;也称OSI 网络层&#xff0c;很少去关心前三层的网络层、数据链路层、物理层&#xff0c;脑海里想到这三层的数据流转&#xff0c;脑海里都是抽象的画面。 本篇浅显的梳理前三层中各…

spring boot 3.2.0 idea从零开始

spring boot 3.2.0 idea从零开始 最新的spring initilizer 不再支持低版本java&#xff0c;只能选择17、21 。 我也被迫尝试下最新版本的java。 jdk下载地址 自定义好artifact和group之后点击下一步。 在这里选择需要的组件&#xff0c;我准备做web项目所以只选择spring web …

Navicat Premium 16.3.3 Windows x64 Crack

增强您的表现。 Navicat 16 具有许多改进和功能&#xff0c;可以满足您的数据库开发需求。凭借 100 多项增强功能和全新界面&#xff0c;您可以探索构建、管理和维护数据库的新方法。构建时考虑到可用性。 Navicat 16 引入了许多 UI/UX 改进&#xff0c;以最大限度地提高您的效…

C++浅谈Actor模型及其应用

文章目录 0 引入1、理解1.1 为什么会出现Actor这种模型呢&#xff1f;1.2 Actor如何解决 2、应用1.SkyNet2.Erlang3.RabbitMQ 3、引用 0 引入 最近发现Actor模型其实我在工作中已经不知不觉实现了&#xff0c;最起码有这些影子。 1、理解 Actor模型是一种轻量级的并发编程模型…

Android--Jetpack--Lifecycle详解

富贵本无根&#xff0c;尽从勤里得 一&#xff0c;定义 Lifecycle 是一个具备宿主生命周期感知能力的组件。它持有组件&#xff08;Activity/Fragment&#xff09;生命周期状态信息&#xff0c;并且允许其观察者监听宿主生命周期状态变化。 顾名思义&#xff0c;Lifecycle的主…

[论文阅读]Sparse Fuse Dense

SFD Sparse Fuse Dense: Towards High Quality 3D Detection with Depth Completion 论文网址&#xff1a;SFD 论文代码&#xff1a;SFD 论文简读 本文主要关注如何利用深度完成技术提高三维目标检测的质量。论文提出了一种名为 SFD&#xff08;Sparse Fuse Dense&#xff0…

SQL server 2016安装

1、关系数据库的基本概念。 行&#xff1a;每行成为一条“记录”或“元组”&#xff0c;用于描述一个对象的信息。 列&#xff1a;每列称为一个“字段”或“属性”&#xff0c;用于描述对象的一个属性。 2、主键与外键。 主键&#xff1a;键&#xff0c;即关键字。主键由一个或…

CentOS或RHEL安装vscode

下载rpm安装包 网络下载或者下载到本地再上传到服务器&#xff0c;点击访问国内下载地址&#xff0c;不需要积分curl -fOL https://github.com/coder/code-server/releases/download/v4.19.1/code-server-4.19.1-amd64.rpm安装 rpm -i code-server-4.19.1-amd64.rpm关闭和禁用…