【ES6】

ES6

  • 1 ES6简介
    • 1.1 什么是ES6
    • 1.2 为什么使用ES6
  • 2 ES6的新增语法
    • 2.1 let
    • 2.2 const
    • 2.3 let、const、var的区别
    • 2.4 解构赋值
      • 2.4.1 数组解构
      • 2.4.2 对象解构
    • 2.5 箭头函数
    • 2.6 剩余参数
  • 3 ES6的内置对象扩展
    • 3.1 Array的扩展方法
      • 3.1.1 扩展运算符(展开语法)
      • 3.1.2 构造函数方法:Array.from()
      • 3.1.3 实例方法find()
      • 3.1.4 实例方法findIndex()
      • 3.1.5 实例方法includes()
    • 3.2 String的扩展方法
      • 3.2.1 模板字符串
      • 3.2.2 实例方法startsWith()和endsWith()
      • 3.2.3 实例方法repeat()
    • 3.3 Set数据结构

1 ES6简介

1.1 什么是ES6

  • ES的全称是ECMAScript,它是ECMA国际标准化组织制定的一项脚本语言的标准化规范。
  • ES6实际上是一个泛指,泛指ES2015及后续的版本。

1.2 为什么使用ES6

  • 每一次标准的诞生都意味着语言的完善、功能的加强;JavaScript语言本身也有一些令人不满意的地方。
  • 变量提升特性增加了程序运行时的不可预测性。
  • 语法过于松散,实现相同的功能,不同的人可能会写出不同的代码。

2 ES6的新增语法

2.1 let

  • ES6中新增的用于声明变量的关键字。
  • 使用let关键字声明的变量的特点:
    1> let声明的变量只在所处于的块级(块级作用域:一个大括号内产生的作用域)有效
    注意:使用let关键字声明的变量才具有块级作用域,使用var声明的变量不具备块级作用域特性。
    拥有块级作用域的变量有一个好处是:防止循环变量变成全局变量。
    2> 使用let关键字声明的变量没有变量提升
    3> 使用let关键字声明的变量具有暂时性死区特性
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>使用let关键字声明变量</title>
</head>
<body><script>// let关键字就是用来声明变量的/* let a = 10;console.log(a); // 10 */// 使用let关键字声明的变量具有块级作用域/* if(true) {let b = 20;console.log(b); // 20if(true) {let c = 30;console.log(c); // 30}console.log(c); // 报错}console.log(b); // 报错 */// 在一个大括号中,使用let关键字声明的变量才具有块级作用域,使用var声明的变量不具备块级作用域特性/* if(true) {let num = 100;var abc = 200;}console.log(abc); // 200console.log(num); // 报错 */// 拥有块级作用域的变量有一个好处是:防止循环变量变成全局变量for(var i = 0; i < 2; i++) {}console.log(i); // 2for(let i = 0; i < 2; i++) {}console.log(i); // 报错</script>
</body>
</html>
// 使用let关键字声明的变量没有变量提升 只能先声明再使用
console.log(a); // 报错 a is not defined
let a = 20;
// 使用let关键字声明的变量具有暂时性死区特性
var tmp = 123;
if(true) {tmp = 'abc'; // 会报错let tmp;
}
  • let经典面试题:
    在这里插入图片描述
    在这里插入图片描述

2.2 const

  • 作用:声明常量,常量就是值(内存地址)不能变化的值。
  • 使用const关键字声明的变量的特点:
    1> 具有块级作用域
    2> 声明常量是必须赋值
    3> 常量赋值后,值不能修改
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>使用const关键字声明变量</title>
</head>
<body><script>// 具有块级作用域/* if(true) {const a = 10;if(true) {const a = 20;console.log(a); // 20}console.log(a); // 10}console.log(a); // 报错 a is not defined */// 声明常量是必须赋初始值// const PI; // 报错 Missing initializer in const declaration// 常量赋值后,值不能修改// 情况一/* const PI = 3.14;PI = 100; // 报错 Assignment to constant variable */// 情况二const ary = [100, 200];arr[0] = 'a';arr[1] = 'b';// console.log(ary); // ['a','b']ary = ['a','b']; // 报错 Assignment to constant variable</script>
</body>
</html>

2.3 let、const、var的区别

  • 使用var声明的变量,其作用域为该语句所在的函数内,且存在变量提升现象。
  • 使用let声明的变量,其作用域为该语句所在的代码块内,不存在变量提升。
  • 使用const声明的是常量,在后面出现的代码中不能再修改该常量的值。
    在这里插入图片描述

2.4 解构赋值

  • ES6中允许从数组中提取值,按照对应位置,对变量赋值。对象也可以实现解构。

2.4.1 数组解构

// 数组解构允许我们按照一一对应的关系从数组中提取值,然后将值赋值给变量
let ary = [1, 2, 3];
// 原先写法
/* ary[0]
ary[1]
ary[2] */
// 现在写法
let [a, b, c] = ary;
console.log(a); // 1
console.log(b); // 2
console.log(c); // 3
  • 如果解构不成功,变量的值为undefined。
let [foo] = []; // undefined
let [bar, foo] = [1]; // 1 undefined

2.4.2 对象解构

// 对象解构允许我们使用变量的名字匹配对象的属性,匹配成功,将对象属性的值赋值给变量
let person = {name: 'zhangsan',age: 20,sex: '男'
};
let { name, age, sex } = person;
console.log(name); // zhangsan
console.log(age); // 20
console.log(sex); // 男
let person = {name: 'zhangsan',age: 20,sex: '男'
};
let { name:myName, age:myAge } = person; // myName myAge 属于别名
console.log(myName); // zhangsan
console.log(age); // 20

2.5 箭头函数

  • ES6中新增的定义函数的方式。
  • () => {}
    const fn = () => {}
// 箭头函数是用来简化函数定义语法的
const fn = () => {console.log(123); // 123
}
fn();
  • 箭头函数特点:
    1> 函数体中只有一句代码,且代码的执行结果就是返回值,可以省略大括号。
    2> 如果形参只有一个,可以省略小括号。
// 函数体中只有一句代码,且代码的执行结果就是返回值,可以省略大括号
// 使用传统的函数定义方式
function sum(num1, num2) {return num1 + num2;
}
// 箭头函数定义方式
const sum = (num1, num2) => num1 + num2;
const result = sum(10, 20);
console.log(result); // 30
// 如果形参只有一个,可以省略小括号
// 使用传统的函数定义方式
function fn(v) {return v;
}
// 箭头函数定义方式
const fn = v => {alert(v);
}
fn(20);
  • 箭头函数不绑定this关键字,箭头函数中的this,指向的是函数定义位置的上下文this
// 箭头函数不绑定this关键字,箭头函数没有自己的this关键字,this关键字将指向箭头函数定义位置中的this
function fn() {console.log(this); // 指向obj对象return () => {console.log(this); // 指向obj对象}
}
const obj = { name: 'zhangsan' };
const resFn = fn.call(obj);
resFn();
  • 箭头函数面试题:
/* var obj = {age: 20,say: () => {alert(this.age); // 弹出undefined}
}
obj.say(); */
// 分析:箭头函数没有自己的this,箭头函数的this指向箭头函数定义位置中的this,当前箭头函数被定义在obj内部,但obj是一个对象,它不能产生作用域,所以实际上箭头函数被定义在了全局作用域下,所以调用say方法时,this指向的是window,而在window对象下面没有age属性,所以弹出undefinedvar age = 100;
var obj = {age: 20,say: () => {alert(this.age); // 弹出100}
}
obj.say();

2.6 剩余参数

  • 当函数实参个数大于形参个数时,我们可以将剩余的实参放入一个数组中。
  • 剩余参数语法允许我们将一个不定数量的参数表示为一个数组。
function sum (first, ...args) {console.log(first); // 10console.log(args); // [20,30]
}
sum(10, 20, 30);
// ...args 代表接收所有的实参
const sum = (...args) => {let total = 0;/* args.forEach(item => {total += item;}) */// 简化后:args.forEach(item => total += item);return total;
};
console.log(sum(10, 20)); // 30
console.log(sum(10, 20, 30)); // 60
  • 剩余参数和解构配合使用
let students = ['wangwu','zhangsan','lisi'];
let [s1,...s2] = students;
console.log(s1); // 'wangwu'
console.log(s2); // ['zhangsan','lisi']

3 ES6的内置对象扩展

3.1 Array的扩展方法

3.1.1 扩展运算符(展开语法)

  • 扩展运算符可以将数组或者对象转为用逗号分隔的参数序列。
let ary = [1, 2, 3];
// ...ary // 1, 2, 3
console.log(...ary); // 1 2 3
console.log(1, 2, 3); //
// 扩展运算符可以将数组拆分成以逗号分隔的参数序列
let ary = ["a", "b", "c"];
// ...ary // "a", "b", "c"
console.log(...ary); // 相当于console.log("a", "b", "c"); // a b c
  • 扩展运算符可以应用于合并数组。
// 方法一
let ary1 = [1, 2, 3];
let ary2 = [3, 4, 5];
let ary3 = [...ary1,...ary2];
console.log(ary3); // [1, 2, 3, 3, 4, 5]
// 方法二
ary1.push(...ary2);
console.log(ary1); // [1, 2, 3, 3, 4, 5]
  • 扩展运算符将伪数组转换为真正的数组(将类数组或可遍历对象转换为真正的数组)。
// 利用扩展运算符将伪数组转换为真正的数组
let oDivs = document.getElementsByTagName('div');
console.log(oDivs); // 结果为伪数组
var ary = [...oDivs];
console.log(ary); // 结果为数组

在这里插入图片描述

3.1.2 构造函数方法:Array.from()

  • Array.from()将类数组或可遍历对象转换为真正的数组。
let arrayLike = {'0': 'a','1': 'b','2': 'c','length': 3
};
let arr2 = Array.from(arrayLike);
console.log(ary2); // ['a', 'b', 'c']
  • Array.from()方法还可以接受第二个参数,作用类似于数组的map方法,用来对每个元素进行处理,将处理后的值放入返回的数组。
let arrayLike = {"0": 1,"1": 2,"length": 2
};
let newAry = Array.from(aryLike, item => item * 2);
console.log(newAry); // [2, 4]

3.1.3 实例方法find()

  • find()用于找出第一个符合条件的数组成员,如果没有找到返回undefined。
let ary = [{id: 1,name: '张三'},{id: 2,name: '李四'}
];
let target = ary.find(item => item.id == 2);
console.log(target);

3.1.4 实例方法findIndex()

  • findIndex()用于找出第一个符合条件的数组成员的位置,如果没有找到返回-1。
let ary = [1, 5, 10, 15];
let index = ary.findIndex((value, index) => value > 9);
console.log(index); // 2
let ary = [10, 20, 50];
let index = ary.findIndex(item => item > 15);
console.log(index); // 1

3.1.5 实例方法includes()

  • includes()表示某个数组是否包含给定的值,返回布尔值。
[123].includes(2) // true
[123].includes(4) // false
let ary = ["a", "b", "c"];
let result = ary.includes("a");
console.log(result); // true

3.2 String的扩展方法

3.2.1 模板字符串

  • 模板字符串是ES6新增的创建字符串的方式,使用反引号定义。
let name = `zhangsan`;
  • 模板字符串特点:
    1> 模板字符串中可以解析变量。
    2> 模板字符串中可以换行。
    3> 在模板字符串中可以调用函数。
// 模板字符串中可以解析变量
let name = 'zhangsan';
let sayHello = `hello,my name is ${name}`;
console.log(sayHello); // hello,my name is zhangsan
// 模板字符串中可以换行
let result = {name: 'zhangsan',age: 20,sex: '男'
}
let html = `<div><span>${result.name}</span><span>${result.age}</span><span>${result.sex}</span></div>
`;
console.log(html);
// 在模板字符串中可以调用函数
const sayHello = function() {return '哈哈哈哈 追不到我吧 我就是这么强大';
};
let greet = `${sayHello()} 哈哈哈哈`;
console.log(greet); // 哈哈哈哈 追不到我吧 我就是这么强大 哈哈哈哈

3.2.2 实例方法startsWith()和endsWith()

  • startsWith():表示参数字符串是否在原字符串的头部,返回布尔值
  • endsWith():表示参数字符串是否在原字符串的尾部,返回布尔值
let str = 'Hello world !';
str.startsWith('Hello') // true
str.endsWith('!') // true

3.2.3 实例方法repeat()

  • repeat()方法表示将原字符串重复n次,返回一个新字符串。
'x'.repeat(3) // "xxx"
'hello'.repeat(2) // "hellohello"

3.3 Set数据结构

  • ES6提供了新的数据结构Set。它类似于数组,但是成员的值都是唯一的,没有重复的值。
  • Set本身是一个构造函数,用来生成Set数据结构。
    const s = new Set();
  • Set函数可以接受一个数组作为参数,用来初始化。
    const set = new Set([1, 2, 3, 4, 4]);
const s1 = new Set();
console.log(s1.size); // 0
const s2 = new Set(["a", "b"]);
console.log(s2.size); // 2
  • 利用Set数据结构做数组去重:
const s3 = new Set(["a", "a", "b", "b"]);
console.log(s3.size); // 2
const ary = [...s3];
console.log(ary);
  • Set实例方法:
    1> add(value):添加某个值,返回Set结构本身
    2> delete(value):删除某个值,返回一个布尔值,表示删除是否成功
    3> has(value):返回一个布尔值,表示该值是否为Set的成员
    4> clear():清除所有成员,没有返回值
const s = new Set();
s.add(1).add(2).add(3); // 向set结构中添加值
s.delete(2) // 删除set结构中的2值
s.has(1) // 表示set结构中是否有1这个值 返回布尔值
s.clear() // 清除set结构中的所有值
  • 遍历:Set结构的实例与数组一样,也拥有forEach方法,用于对每个成员执行某种操作,没有返回值。
    s.forEach(value => console.log(value))
// 遍历set数据结构 从中取值
const s5 = new Set(['a', 'b', 'c']);
s5.forEach(value => {console.log(value);
})

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

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

相关文章

Docker 部署 Bitwarden RS 服务

Bitwarden RS 服务是官方 Bitwarden server API 的 Rust 重构版。因为 Bitwarden RS 必须要通过 https 才能访问, 所以在开始下面的步骤之前, 建议先参考 《Ubuntu Nginx 配置 SSL 证书》 配置好域名和 https 访问。 部署 Bitwarden RS 拉取最新版本的 docker.io/vaultwarden…

第一百五十二回 自定义组件综合实例:游戏摇杆三

文章目录 内容回顾优化性能示例代码我们在上一章回中介绍了 如何实现游戏摇杆相关的内容,本章回中将继续介绍这方面的知识.闲话休提,让我们一起Talk Flutter吧。 内容回顾 我们在前面章回中介绍了游戏摇杆的概念以及实现方法,并且通过示例代码演示了实现游戏摇杆的整个过程…

Windows安装cuda和cudnn教程最新版(2023年9月)

文章目录 cudacudnn cuda 查看电脑的cuda最高驱动版本&#xff08;适用于N卡电脑-Nvidia&#xff09; winR打开命令行&#xff0c;输入nvidia-smi 右上角cuda -version就是目前支持的最高cuda版本&#xff0c;目前是12.2 nvidia官网下载cuda 下载地址&#xff1a;https://d…

基于eBPF的安卓逆向辅助工具——stackplz

前言 stackplz是一款基于eBPF技术实现的追踪工具&#xff0c;目的是辅助安卓native逆向&#xff0c;仅支持64位进程&#xff0c;主要功能如下&#xff1a; hardware breakpoint 基于pref_event实现的硬件断点功能&#xff0c;在断点处可读取寄存器信息&#xff0c;不会被用户…

C/C++自定义读取ini、cfg配置文件

常见cfg、ini文件如下: [config1] setting192.168.1.1 [config2] setting192.168.1.2 [config3] setting192.168.1.3 示例代码使用 // opt_ini.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 //#include <iostream> #include "cfg.h"…

短信登录功能如何实现?

简介&#xff1a; 在日常生活中我们登录/注册某些网站/APP是通常可以选择 密码登录和手机号登录。 为什么手机号发送后会有验证码返回呢&#xff1f; 网站如何识别我的验证码是否正确&#xff1f; 如果我的个人网站也想要实现短信登录功能&#xff0c;具体该如何实现&#xff1…

获取文件创建时间

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl Java源码 public void testGetFileTime() {try {String string "E://test.txt";File file new File(string);Path path file.toPath();BasicFileAttributes ba…

如何把利用paddlepaddle导出的json文件转化为yolo或者voc文件

目录 1. 修改源码&#xff0c;让模型能够生成出对于单个图像的标注。 2. 把数据转为yolo格式 3.把yolo格式转化为xml格式 这两天想偷懒&#xff0c;想让模型先在数据上标一遍&#xff0c;然后我再做修正&#xff0c;主要是图个省事。由于我们主要是利用paddle,模型也是基于p…

冒泡排序与选择排序(最low的两兄弟)

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 前言&#xff1a; 在我们的生活中&#xff0c;无处不在用到排序&#xff0c;比如说成绩的排名&#xff0c;淘宝&#xff0c;京东等等商品在各个方面的排序&#xff0c;这样看来一个好的算 法很重要&#xff0c;接下来我们要先…

【刷题-牛客】链表内指定区间反转

链表定区间翻转链表 题目链接题目描述核心思想详细图解代码实现复杂度分析 题目链接 链表内指定区间反转_牛客题霸_牛客网 (nowcoder.com) 题目描述 核心思想 遍历链表的过程中在进行原地翻转 [m,n]翻转区间记作子链表,找到子链表的 起始节点 left 和 终止节点 right记录在…

组队竞赛(int溢出问题)

目录 一、题目 二、代码 &#xff08;一&#xff09;没有注意int溢出 &#xff08;二&#xff09;正确代码 1. long long sum0 2. #define int long long 3. 使用现成的sort函数 一、题目 二、代码 &#xff08;一&#xff09;没有注意int溢出 #include <iostream&g…

自动化测试的定位及一些思考

大家对自动化的理解&#xff0c;首先是想到Web UI自动化&#xff0c;这就为什么我一说自动化&#xff0c;公司一般就会有很多人反对&#xff0c;因为自动化的成本实在太高了&#xff0c;其实自动化是分为三个层面的&#xff08;UI层自动化、接口自动化、单元测试&#xff09;&a…

Sourcetree 无法打开/闪退问题

Sourcetree在某次开机以后无法打开或者是闪退。 Sourcetree是一款Git的可视化图形管理界面,提供了Windows和Mac的免费Git客户端,很方便的管理项目的代码版本 出现问题的环境 win11&#xff0c;sourcTree版本&#xff1a;3.4.12.0 在开始菜单搜索sourcetree&#xff0c;打开…

线上论坛之单元测试

对线上论坛进行单元测试的测试报告 源码地址&#xff1a;https://gitee.com/coisini-thirty-three/forum 一、用户部分&#xff08;UserServiceImplTest&#xff09; 1.创建普通用户 测试名称 createNormalUser() 测试源码 Test void createNormalUser() { // 构造用户 User …

为您的SSH提提速

SSH是运维和开发人员接触比较多的工具&#xff0c;一般用SSH来连接远程服务器&#xff0c;这个是我的一些免费客户和企业客户经常使用的场景&#xff0c;当然SSH除了远程连接之外&#xff0c;还有很多额外的用途&#xff0c;比如SSH本身是具备代理功能的&#xff0c;我们也有一…

【Seata】seata的部署和集成

一、部署Seata的tc-server 1.下载 首先我们要下载seata-server包&#xff0c;地址在http://seata.io/zh-cn/blog/download.html 当然&#xff0c;课前资料也准备好了&#xff1a; 2.解压 在非中文目录解压缩这个zip包&#xff0c;其目录结构如下&#xff1a; 3.修改配置 修…

【MySQL】索引

索引 索引是帮助 MySQL 高效获取数据的数据结构&#xff08;有序&#xff09;。在数据之外&#xff0c;数据库系统还维护着满足特定查找算法的数据结构&#xff0c;这些数据结构以某种方式引用&#xff08;指向&#xff09;数据&#xff0c;这样就可以在这些数据结构上实现高级…

pyspark常用算子总结

欢迎关注微信公众号&#xff0c;更多优质内容会在微信公众号首发 1. pyspark中时间格式的数据转换为字符串格式的时间&#xff0c;示例代码 from datetime import datetimedate_obj datetime(2023, 7, 2) formatted_date date_obj.strftime("%Y-%m-%d %H:%M:%S")p…

【MySQL数据库事务操作、主从复制及Redis数据库读写分离、主从同步的实现机制】

文章目录 MySQL数据库事务操作、主从复制及Redis数据库读写分离、主从同步的实现机制ACID及如何实现事务隔离级别&#xff1a;MVCC 多版本并发控制MySQL数据库主从复制主从同步延迟怎么处理Redis 读写分离1.什么是主从复制2.读写分离的优点 Redis为什么快呢&#xff1f; MySQL数…

Docker初识

什么是Docker 微服务虽然具备各种各样的优势&#xff0c;但服务的拆分通用给部署带来了很大的麻烦。 分布式系统中&#xff0c;依赖的组件非常多&#xff0c;不同组件之间部署时往往会产生一些冲突。在数百上千台服务中重复部署&#xff0c;环境不一定一致&#xff0c;会遇到…