【前端】ES6

news2025/2/25 6:42:54

let 和 const

类似var定义变量,但是let修饰的变量仅在声明的代码块中有效;
var声明的变量,在全局有效

for (let i = 0; i < 3; i++) {
  let i = 'abc';
  console.log(i);
}

js中的for循环声明循环变量的部分也作为一个父作用域,即(let i = 0; 😉, 而代码块部分的let i = ‘abc’为一个子作用域。
let修饰的变量必须先声明再使用。

let 和 var 使用对比:

<ul>
   <li>1</li>
   <li>2</li>
   <li>3</li>
   <li>4</li>
 </ul>
 <script>
   const lis = document.querySelector('ul').querySelectorAll('li')
   for (var i = 0; i < lis.length; i++) {
     lis[i].addEventListener('click', function () {
       console.log(lis[i]);  // undefined
     })
   }
 </script>

这里使用var作为循环变量的声明,但由于使用的是var,所以 i 为全局变量,当循环结束 i 数值为 lis.length, 超过数组下标;当触发事件的时候 lis[i] 下标越界因此为 undefined;
解决方案为使用 let 替代 var,这样含义为在每一次绑定事件时声明一个 let i 记录当前下标。

只要使用let 进行声明变量后,那么该变量之前的部分称为 “死区”,再死区部分使用let变量会报错

temp = "abc"

let temp;  // 该代码之前为死区部分,无法访问

let修饰的变量,不允许重复声明。

ES6中的块级作用域中允许声明函数。

const修饰的变量表示常量,一旦声明,不能改变。维护的是变量指向的内存地址是不变的。

字符串

字符串多行定义

ES6中可以使用反引号(`)标识,当作普通的字符串或者定义多行字符串,或者嵌入变量
在这里插入图片描述

new Vue({
   el: '#app',
    computed: {
        b() {
            let [name, age] = ['righteye', 18]
            return `this is a template string, username = ${name}, age = ${age}`
        }
    }
})

标签模板

一种函数调用的特殊形式,以 tag`content` 的形式进行展现,其中tag为函数名,后面的content为反引号包裹的模板字符串。
参数:param会接收被${} 变量分割的普通的字符串信息,变量会被后面的其他参数接收。

new Vue({
    el: '#app',
    methods: {
        f(param, ...val) {
            // param: ['hello', 'world']
            // val: ['righteye', 18]
            // typeof val: object
            console.log(param, val, typeof val)  
            return param + val
        }
    },
    computed: {
        a() {
            let name = 'righteye'
            let age = 18
            return this.f`hello ${name} world ${age}`
        },
        b() {
            let [name, age] = ['righteye', 18]
            return `this is a template string, username = ${name}, age = ${age}`
        }
    }
})

箭头函数

ES6可以使用箭头函数简化代码的书写:

var f = v => v;

// 等同于
var f = function (v) {
  return v;
};

对于普通函数,内部的this指向运行时的所在的对象,即调用者;而对于箭头函数,this指向定义时所在的作用域, 函数的所用者

<p id="banner"></p>
<p id="demo"></p>

<p id="res"></p>

<script>
    function Hello() {
        this.s1 = 2;
        this.s2 = 0;
        // setTimeout(function() {
        //     console.log(this); // Window
        //     document.getElementById("banner").innerText = "我是普通函数"
        //     document.getElementById("demo").innerText = ++this.s1 + " " + this.s2;  // NaN undefine
        // }, 1000);
        setTimeout(() => {
            console.log(this);  // Hello
            document.getElementById("banner").innerText = "我是箭头函数"
            document.getElementById("demo").innerText = ++this.s1 + " " + this.s2;  // 3 0
        }, 1000);
    }

    h = new Hello();

    document.getElementById("res").innerText = h.s1 + " " + h.s2;
</script>

上述案列中在传统 function() 定义方式中, 定时器执行指向调用者为 window 对象; 而使用箭头函数执行时 this 执行为声明时作用域, 即 funciton Hello() {}, 因此返回 Hello。

另外的, 箭头函数中不存在 arguments 参数,不能作为构造函数声明对象。对于 arguments 参数, es6 中使用 rest 参数进行替代

let fn = (...args) => {
	console.log(args);  // (5) [1, 2, 3, 4, 5]
}
fn(1, 2, 3, 4, 5);  

使用 ‘…参数名称’ 并放在所有形参的末尾,参数类型为数组。

// ES6
function foo() {
  setTimeout(() => {
    console.log('id:', this.id);
  }, 100);
}

// ES5
function foo() {
  var _this = this;

  setTimeout(function () {
    console.log('id:', _this.id);
  }, 100);
}

迭代器的使用

使用迭代器的对象,内部包含 Symbol.iterator 属性,此类对象可以使用 for … of 进行遍历,相对 for … in 获得 key ,该遍历用于获取 value。

const arr = {
  name: 'abc',
  status: [
    'lufei',
    'suolong',
    'shanzhi',
    'qiaoba'
  ],
  // 1. 迭代对象需要包含 Symbol.iterator 属性
  // 2. Symbol.iterator 返回一个对象
  // 3. [2]中返回对象需要包含 next 方法
  // 4. 返回的对象需要包含 value 和 done 属性
  [Symbol.iterator]() {
    let index = 0;
    return {
      next: () => {
        if (index < this.status.length) {
          return {
            value: this.status[index++],
            done: false
          }
        } else {
          return { value: undefined, done: true }
        }
      }
    };
  }
}
// 遍历 arr, 直接返回 status 中的值
for (let value of arr) {
  console.log(value);
}

Promise

  1. 异步编程的一种解决方案;通过new Promise()可以创建对象,该对象具有状态:进行中,已成功,已失败,一旦使用resolve()状态便定性不可以再更改,后续的回调方法也会理解得到当前状态下的结果。
    通过Promise可以将异步的操作同步的表现出来。

  2. Promise中的then()添加再Promise.prototype的原型链上,可以为Promise实例添加状态改变时的回调函数;也就是可以通过返回Promise对象继续再then()的方法中改变当前Promise的状态(resolve/reject),以链的形式调用then()方法

  3. Promise.prototype.catch可以捕获reject抛出的异常;但是在调用resolve()后再次抛出异常是无效的。

const promise = new Promise(function(resolve, reject) {
  resolve('ok');
  throw new Error('test');  // 无效的抛出异常
});
  1. Promise的错误具有冒泡的性值,可以一直上传直到被捕获。
<div id="app">
        <span> {{ value }} </span>
    </div>

    <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
    <script>
        new Vue({
            el: '#app',
            data: {
                value: ''
            },
            methods: {
                onPromiseHandle(data) {
                    return new Promise((resolve, reject) => {
                        resolve(data);   // resolve的调用会继续进入then语句中
                        // reject("fail"); // reject会被catch捕获,如果没有继续向上抛出异常
                    }).then((data) => {
                        return Promise.resolve(data + 'js');
                    }).then((data) => {
                        return Promise.resolve(data + "xxx");
                    }).then((data) => {
                        this.value = data;
                        return this.value;
                    })
                    // .catch((err) => {
                    //     console.log(err)
                    // })
                }
            },
            mounted() {
               this.onPromiseHandle("hello").then((data) => {
                    console.log("=>", data)
               }).catch((err) => {
                    console.log("error=>", err)
               })
            }
        })
    </script>

其中 Promise.resolve()等价于:

Promise.resolve('foo')
// 等价于
new Promise(resolve => resolve('foo'))

Generator

function* helloWorldGenerator() {
  yield 'hello';
  yield 'world';
  return 'ending';
}

var hw = helloWorldGenerator();

通过yield定义不同的状态,使用* 号定义Generator返回迭代器对象;每一次需要以hw.next()的方式进行获取yield的结果

hw.next()
// { value: 'hello', done: false }

hw.next()
// { value: 'world', done: false }

hw.next()
// { value: 'ending', done: true }

hw.next()
// { value: undefined, done: true }

yield类似暂停的函数,遇到yield后会将yield后的表达式结果作为返回值,并且阻塞后面的操作,只有在调用next()后才会继续执行。
一个函数中可以执行多个yield,但是只能有一个return

async函数

相比于Generator,async函数就是将 Generator 函数的星号(*)替换成async,将yield替换成await

new Vue({
    el: '#app',
    data: {
    },
    methods: {
        *testGenerator() {  // 定义一个Generator
            for (let i = 0; i < 5; i++) {
                yield i + 1
            }
        }
    },
    computed: {
        a() {
            let res = ""
            let taskObj = this.testGenerator();
            let task;
            while (!(task = taskObj.next()).done) {  // 消费task的value
                res += task.value;
            }

            return res
        }
    }
})
const asyncReadFile = async function () {
  const f1 = await readFile('/etc/fstab');
  const f2 = await readFile('/etc/shells');
  console.log(f1.toString());
  console.log(f2.toString());
};

类似的ES6 还有 class 扩展, 类比 Java, 包含 set 和 get 方法, 类继承等

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

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

相关文章

虹科方案|数据中心虚拟化和 HK-ATTO 产品—旨在协同工作的端到端解决方案

一、概述虚拟化技术正迅速成为现代数据中心的基础&#xff0c;因为IT 管理寻求显着提 高资源和运营效率以及对业务需求的响应能力。三个关键技术非常重要&#xff1a;服务器虚拟化、结构虚拟化和存储虚拟化。 本次介绍了 HK-ATTO 产品如何作为这些虚拟化解决方案中 每一个的关键…

【图像处理OpenCV(C++版)】——4.1 对比度增强之灰度直方图

前言&#xff1a; &#x1f60a;&#x1f60a;&#x1f60a;欢迎来到本博客&#x1f60a;&#x1f60a;&#x1f60a; &#x1f31f;&#x1f31f;&#x1f31f; 本专栏主要结合OpenCV和C来实现一些基本的图像处理算法并详细解释各参数含义&#xff0c;适用于平时学习、工作快…

声纹识别与声源定位(二)

一、引言 什么是声源定位(Sound Source Localization&#xff0c;SSL)技术&#xff1f;声源定位技术是指利用多个麦克风在环境不同位置点对声信号进行测量&#xff0c;由于声信号到达各麦克风的时间有不同程度的延迟&#xff0c;利用算法对测量到的声信号进行处理&#xff0c;由…

【瑞萨RA4系列】使用TinyMaix识别手写数字

文章目录一、TinyMaix简介1.1 TinyMaix开源项目1.2 下载TinyMaix源码二、TinyMaix移植2.1 创建TinyMaix移植项目2.2 添加TinyMaix源码三、TinyMaix测试准备3.1 SysTick计时3.2 printf打印3.4 修改tm_port.h文件3.6 增大堆内存空间四、手写数字识别4.1 添加示例源码4.2 运行示例…

突破6.8关口 人民币汇率快速升值,释放什么信号?

近期以来&#xff0c;人民币表现强劲。2023年开年6个交易日&#xff0c;人民币对美元汇率中间价实现“六连涨”&#xff0c;累计上调2035个基点&#xff0c;升破6.8关口&#xff0c;展现出全新面貌。哪些因素影响近期人民币对美元汇率上涨&#xff1f;人民币兑美元汇率未来走势…

漏洞复现--xss

目录 一、实验目的 二、实验环境 三、 实验过程 搭建XSS平台 制作XSS脚本并注入 利用Cookie登录用户账号 一、实验目的 实验目的 本实验学习如何搭建个人的XSS平台以及如何使用XSS平台盗用用户Cookie登录。 二、实验环境 服务器&#xff1a;Windows 7 Target IP:10.1.…

【笔记:第5课】学习开发一个RISC-V上的操作系统 - 汪辰 - 2021春

文章目录前言来源正文小结前言 创作开始时间&#xff1a;2023年1月11日16:55:32 如题&#xff0c;学习一下RISC-V。 来源 https://www.bilibili.com/video/BV1Q5411w7z5?p5&vd_source73a25632b4f745be6bbcfe3c82bb7ec0 刚刚才知道老师是PLCT实验室的&#xff0c;牛。…

C 程序设计教程(16)—— 循环结构程序设计

C 程序设计教程&#xff08;16&#xff09;—— 循环结构程序设计 该专栏主要介绍 C 语言的基本语法&#xff0c;作为《程序设计语言》课程的课件与参考资料&#xff0c;用于《程序设计语言》课程的教学&#xff0c;供入门级用户阅读。 目录C 程序设计教程&#xff08;16&…

Vue3之对Dialog的简单封装

之前使用的UI框架,无论是Element UI/Plus 还是 Ant design&#xff0c;其中Dialog组件中的结构和样式都难以修改&#xff0c;无论是使用less、deep还是其他方法&#xff0c;对其组件中css的修改都不生效&#xff08;不确定是否有其他解决方法&#xff09;&#xff0c;所以我就自…

【小白必看】2023年PMP考试报名时间,报考条件,超全PMP备考指南

PMP 考试一年能考四次&#xff0c;分别是3月、6月、9月、12月&#xff0c;提前 2 个月开始报名&#xff0c;但还是要关注PMI/基金会官网的信息&#xff0c;有特殊情况的会在官网公布。现在放开了&#xff0c;2023年PMP 考试应该不会再延期了&#xff0c;之前没考上的&#xff0…

重装系统win11的步骤和详细教程

想要给电脑重装系统win11使用&#xff0c;但是自己对于相关的重装操作不熟悉怎么样?我们可以网上的小白装机工具实现&#xff0c;那么具体怎么重装系统win11?下面就演示下重装系统win11的步骤和详细教程。 工具/原料&#xff1a; 系统版本&#xff1a;Windows 11 品牌型号…

js使用小顶堆构建优先级队列

什么是优先级队列? 优先级队列是队列的一个变种,队列是一个先进先出的结构,在头部出队元素在尾部入队元素, 优先级队列顾名思义就是给每个元素具备了优先级,优先级决定了元素在队列中的存储位置,优先级越高的越靠前越先出队 小顶堆又是什么? 小顶堆是堆结构的一个分支,堆…

浙大MEM提面优秀成功上岸经验分享——完全准备才能“聊”的好

近期元旦放假&#xff0c;终于有时间写一写关于自己浙大MEM提面上岸的一些经验分享了。这篇可能对接下来参加2024年浙大mem考试的考生会有一些作用。因为我是参加了提前批面试&#xff0c;并在面试中取得了优秀的资格&#xff0c;所以这也为我后续的联考和录取环节减轻了不少的…

[JAVA安全]filter 内存马

原理&#xff1a; Servlet 有自己的过滤器 filter &#xff0c; 可以通过自定义的过滤器&#xff0c;来对用户的请求进行拦截等操作。 经过filter 之后才会刀Servlet &#xff0c;如果我们动态创建一个 filter 并且将其放在最前面&#xff0c;我们的filter 就会最先被执行&…

Java多线程案例——线程池及ThreadPoolExecutor类

一&#xff0c;线程池1.为什么会有线程池&#xff1f;线程池和多线程的区别&#xff1f;为了很好的解决高并发问题&#xff0c;提高计算机的运行效率&#xff0c;提出了多线程来取代多进程&#xff08;因为一个线程的创创建、销毁和调度比进程更加“轻量”&#xff0c;所以线程…

杰卡德相似度(Jaccard)详解及在UserCF中的应用

1、杰卡德相似度(Jaccard) 这个是衡量两个集合的相似度一种指标。 两个集合A和B的交集元素在A&#xff0c;B的并集中所占的比例&#xff0c;称为两个集合的杰卡德相似系数&#xff0c;用符号J(A,B)表示 另一种表示的方法&#xff1a; jaccard系数衡量维度相似性 jaccard系数很…

IT运维.服务器常见资质认证

3C证书 强制要求 CCC认证的全称为“中国强制性产品认证“ 它是为保护消费者人身安全和国家安全、加强产品质量管理、依照法律法规实施的一-种产品合格评定制度。, 节能

spring之动态代理

文章目录前言一、JDK动态代理1、业务接口OrderService2、目标对象OrderServiceImpl3、客户端程序Client4、InvocationHandler 的实现类TimeInvocationHandler5、运行结果二、CGLIB动态代理1、先引入依赖2、目标类 UserService3、客户端程序Client4、MethodInterceptor的实现类T…

温振传感器的信号输出方式及应用领域

在振动测量系统中&#xff0c;测量振动的仪器排在前端。温振传感器也称为温度振动传感器&#xff08;变送器&#xff09;&#xff0c;它可以将被测对象的振动量&#xff08;位移、速度&#xff09;准确接受后&#xff0c;并将此机械量转换为电信号显示出来。 在工业生产、食品…

内存对齐(memory align)

0. 内存结构 我们平时所称的内存也叫随机访问存储器&#xff08;random-access memory&#xff09;也叫RAM。而RAM分为两类&#xff1a; 一类是静态RAM&#xff08;SRAM&#xff09;&#xff0c;这类SRAM用于前边介绍的CPU高速缓存L1Cache&#xff0c;L2Cache&#xff0c;L3C…