ES6
一、概述
ECMAScript 6,简称 ES6 ,是 JavaScript 语言的一次重大更新。它于 2015 年发布,
是原来的 ECMAScript 标准的第六个版本。ES6 带来了大量的新特性,
包括 箭头函数、模板字符串、let 和 const 关键字、解构、默认参数值、模块系统 等等,
大大提升了 JavaScript 的开发体验。
ES6 对 JavaScript 的改进在以下几个方面:
更加简洁:ES6 引入了一些新的语法,如箭头函数、类和模板字符串等,使代码更加简洁易懂。
更强大的功能:ES6 引入了一些新的 API、解构语法和迭代器等功能,从而使得 JavaScript 更加强大。
更好的适用性:ES6 引入的模块化功能为 JavaScript 代码的组织和管理提供了更好的方式,不仅提高了程
序的可维护性,还让 JavaScript 更方便地应用于大型的应用程序。
历史版本:
| 标准版本 | 发布时间 | 新特性 |
|---|---|---|
| ES1 | 1997年 | 第一版 ECMAScript |
| ES2 | 1998年 | 引入 setter 和 getter 函数,增加了 try/catch,switch 语句允许字符串 |
| ES3 | 1999年 | 引入了正则表达式和更好的字符串处理 |
| ES4 | 取消 | 取消,部分特性被ES3.1和ES5继承 |
| ES5 | 2009年 | Object.defineProperty,JSON,严格模式,数组新增方法等 |
| ES5.1 | 2011年 | 对ES5做了一些勘误和例行修订 |
ES6 | 2015年 | 箭头函数、模板字符串、解构、let和const关键字、类、模块系统等 |
| ES2016 | 2016年 | 数组.includes,指数操作符(**),Array.prototype.fill 等 |
| ES2017 | 2017年 | 异步函数 async/await,Object.values/Object.entries,字符串填充 |
| ES2018 | 2018年 | 正则表达式命名捕获组,几个有用的对象方法,异步迭代器等 |
| ES2019 | 2019年 | Array.prototype.{flat,flatMap},Object.fromEntries等 |
| ES2020 | 2020年 | BigInt、动态导入、可选链操作符、空位合并操作符 |
| ES2021 | 2021年 | String.prototype.replaceAll,逻辑赋值运算符,Promise.any等 |
| ... ... |
二、关于 let & const
ES6 新增了
let和const,用来声明变量 , 使用的细节上也存在诸多差异
let和var的差别1、let 不能重复声明
2、let 有块级作用域,非函数的花括号遇见let会有块级作用域,也就是只能在花括号里面访问。
3、let 不会预解析进行变量提升
4、let 定义的全局变量不会作为 window 的属性
5、let 在 es6 中推荐优先使用
html
<script>
//1. let只有在当前代码块有效代码块. 代码块、函数、全局
{
let a = 1
var b = 2
}
// console.log(a); // ReferenceError: a is not defined 花括号外面无法访问
console.log(b); // 可以正常输出
//2. 不能重复声明
// let name = '天真'
// let name = '无邪'
//SyntaxError: Identifier 'name' has already been declared
//3. let 不存在变量提升(先声明,在使用)
console.log(test) //可以 但是值为undefined
var test = 'test'
//console.log(test1) //不可以 let命令改变了语法行为,它所声明的变量一定要在声明后使用,否则报错。
// let test1 = 'test1'
//ReferenceError: Cannot access 'test1' before initialization
//4、let不会成为window的属性
var a = 100
console.log(window.a) //100
let b1 = 200
console.log(window.b1) //undefined
//5. 循环中推荐使用
for (let i = 0; i < 10; i++) {
// ...
}
// console.log(i); //循环外不能访问
// ReferenceError: i is not defined
</script>const和var的差异1、新增 const 和 let 类似,只是 const 定义的变量不能修改
2、关键理解在意 const 在栈内存的那个对应的值不能变
- 如果是普通类型的变量,那么值就是实际的值
- 但如果是一个引用类型的变量,栈内存的值是地址值,实际内容在堆内存里
- 普通的就对应于值不能修改,引用类型的比如数组内增删,这并没有修改地址,这是允许的
html
<script>
//声明场景语法,建议变量名大写区分
const PI = 3.1415926;
//1.常量声明必须有初始化值
//const A ; //报错
//2.常量值不可以改动
//const A = 'irai'
//A = 'xx' //不可改动
//3.和let一样,块级作用域
{
const A = 'irai'
console.log(A);
}
//console.log(A); //报错,访问不到
//4.对应数组和对象元素修改,不算常量修改,修改值,不修改地址
const TEAM = ['刘德华','张学友','郭富城'];
TEAM.push('黎明');
//TEAM=[] // 报错(这相当于新new了一个数组,然后变成了新的地址值)
console.log(TEAM)
</script>三、模板字符串
模板字符串(
template string)是增强版的字符串,用 反引号(`)标识
字符串中可以出现换行符
可以使用
${xxx}形式输出变量和拼接变量
html
<script>
// 1 多行普通字符串(太麻烦~~)
let ulStr =
'<ul>'+
'<li>JAVA</li>'+
'<li>html</li>'+
'<li>VUE</li>'+
'</ul>'
console.log(ulStr)
// 2 多行模板字符串
let ulStr2 = `
<ul>
<li>JAVA</li>
<li>html</li>
<li>VUE</li>
</ul>`
console.log(ulStr2)
// 3 普通字符串拼接
let name ='张小明'
let infoStr =name+'被评为本年级优秀学员'
console.log(infoStr)
// 4 模板字符串拼接
let infoStr2 =`${name}被评为本年级优秀学员`
console.log(infoStr2) //张小明被评为本年级优秀学员
</script>