ES6的新特性有哪些
1.新增块级作用域(let,const)
在ES6之前只有全局作用域和局部作用域,ES6新增了块级作用域let和const,下面将简单介绍var、let和const的特点以及区别。
块级作用域:只能在声明的区域(代码块)中使用,不能在声明的区域的外部使用,否则报(xxx is not defined)。
var:使用var声明的变量,其作用域为该变量所在的函数内,且存在变量提升现象(变量提升:可以先使用再声明),不会受到块级作用域的影响
let:ES6新增的块级作用域
1:使用let声明的变量具有块级作用域:,只能在当前声明的代码块中使用,必须要先声明再使用
2:具有暂时性死区特性。在代码块内,使用let和const命令声明变量之前,该变量都是不可用的,语法上被称为暂时性死区。
const:ES6中新增的常量(常量:值(内存地址)不可更改的量)。特点如下:
3.1:具有块级作用域的特点,只能在当前声明的代码块中使用,必须要先声明再使用。
3.2:声明常量时必须赋值,如果不赋值报错:Missing initializer in const declaration(在const声明中未初始化)。
3.3:const声明的常量不可更改。
3.4:使用const声明的常量如果是基本数据类型(比如:数字、字符串),一旦赋值,值不可以更改;如果是引用数据类型(数组,对象),不能重新赋值,但是可以更改数据结构内部的值(比如修改对象中的属性)。
2.新增了定义类语法糖(class)
1.class是ES6提供的一个语法糖,本质是一个函数。
2.在class中声明方法,不需要function关键字。
3.class存在暂时型死区,在声明之前不能调用。
4.class默认有constructor、static方法。(constructor 方法是类的默认方法,创建类的实例化对象时被调用。)<script> class Start { constructor(){ console.log("constructor已执行!"); } } new Start(); // 输出:constructor已执行! </script>
5.class构造时必须使用new关键字。
3.新增了一种数据结构(symbol)
symbol–可以说是独一无二
symbol是一个原始数据类型,而不是一个对象,所以不能用new,用了就报错喽
symbol的值可以转化为字符串、布尔值
symbol的值不能和其他类型的值进行运算
symbol的参数只是当前symbol值的描述,相同参数的值是不相等的
每一个symbol值都是独一无二的奥,正是因为这样,我们才能把他作为对象属性名
4.新增了解构赋值
解构:分解数据结构。
赋值:为变量赋值。
解构赋值:从数组或者对象中提取值,按照对应的位置,对变量赋值(在数组解构中,只要解构的目标可以遍历,就可以实现解构赋值)。例如:(数组解构)
let [a, b, c] = [1, 2, 3]; // a = 1 // b = 2 // c = 3
具体可以看菜鸟教程
5.新增了函数参数的默认值
在ES6之前,不能直接将函数的参数指定默认值,只能采用变通的方法
所以呢,ES6就允许给参数的参数设置默认值
例如:
function aaa(x,y=‘Hello’){
}
6.给数组增加了一些API
例如:(具体可以点击查看)
1.Array.of()
用于将一组值,转换为数组
Array
let arr0 = new Array(4);
console.log(arr0);// [empty,empty,empty,empty]
1
2
Array.of()
let arr2 = Array.of(4)
console.log(arr2); //[4]2.Array.form()
将两类对象(arguments,元素集合,自定义类数组[‘0’:100,length:1])转为真正的数组
3.find()
用于找出第一个符合条件的数组成员,并且返回该数组元素
如果没有满足条件的数组元素该方法返回undefined
4.findIndex()
用于找出第一个符合条件的数组成员的索引值,并且返回该数组元素的索引值
如果没有满足条件的数组元素该方法返回-1
5.fill()
给数组指定的索引,以指定值进行填充
//—第一个参数是填充的值
//—第二个参数是起始索引 默认值是0
//—第三个参数是结束的索引(不包含) 默认值是数组length
6.copyWithin()
在当前数组内部,将指定位置的成员复制到其他位置,然后返回当前数组
// —第二个参数为起始索引
// —第三个参数为结束索引**(不包含)**,将对应的数组元素赋值给第一个参数设置的开头的索引,依次取替换原索引上的值
7.includes()
判断数组是否包含指定值—是全等判断
相当于Object.is()
//—第一个值是包含的指定值
//—第二个值是指定值的索引
7.对象和数组新增了扩展运算符
具体可点击
1. 拓展运算符 …
let arr2 = […arr]
就这样,我们就可以直接拷贝到arr的值
拓展运算符的作用就是将数组分割,并将个项作为分离的参数传给函数
2.Array 构造函数新增方法
1.Array.from()将类数组对象转换为数组对象2.Array.of(a,b,c)相当于创建了一个新数组
这里要注意的是,Array.of(3)!=new Array(3)
前者表示的是数值为3,后者表示数组长度为33.Array.isArray(arr) 判断arr是否是一个数组,返回布尔值
3.数组新增对象的方法
1.find() 返回数组中第一个满足条件的元素
2.findIndex()返回数组中第一个满足条件的元素的索引3.entries()帮助数组遍历每一个key值和value值
4.keys() 帮助数组遍历所有key值5.includes()数组中存在某个值,返回布尔值,和indexOf用法相同
6.filter() 过滤数组单元,将满足条件的元素过滤
7.map() 对数组进行遍历,将计算后的值返回数组8.some()只要有一个满足条件,返回ture
9.every()只要有一个不满足条件,则返回false
10.reduce((x,y)=>x+y)做累加
8.Promise
1.解决回调地狱的问题
(什么是回调地狱)
在回调函数里边,嵌套回调函数,就是回调地狱、
这次请求需要上一次请求的结果
promise优化回调地狱 & async await 优化回调地狱
promise优化回调地狱 原理就是axios.get() 它相当于let p=axios.get() 也是一个promise对象,promise对象都有.then方法。
async await优化回调地狱的原理是async修饰后的函数 它的返回值就是await axios.get() 所以这里可以省略.then 用一个变量直接接收await axios.get()的返回值。再在函数外面接收这个函数的返回值。
2.自身有all,reject,resolve,race方法3.原型上有then,catch
4.异步操作队列化
5.三种状态:
Pending(进行中,初始状态,既不是成功,也不是失败状态。)、Resolved(已完成,又称 Fulfilled)、Rejected(已失败)
这三种状态的变化途径只有2种:
异步操作从 未完成 pending => 已完成 resolved
异步操作从 未完成 pending => 失败 rejected
状态一旦改变,就无法再次改变状态,这也是它名字 promise-承诺 的由来,一个promise对象只能改变一次async await
同步代码做异步操作,两者必须搭配使用
async表明函数内部有异步操作,调用函数返回promise
await是组成async的表达式,结果是取决于它等待的内容,如果是promise那就是promise的结果,如果是普通函数,就进行链式调用
await后的promise如果是reject,那么整个async函数就会中断,后面的代码就不执行了
9.新增了模块化(import,export)
10.新增了set和map数据解构
set就是唯一性,不重复
map:key的类型不受限制
11.新增了generator
可以让函数暂停
具体可以看这里
Generator函数(生成器)是ES6提供的一种异步编程解决方案,形式上也是一个普通函数,但有几个显著的特征:
function关键字与函数名之间有一个星号 “*” (推荐紧挨着function关键字)
函数体内使用 yield 表达式,定义不同的内部状态 (可以有多个yield)
直接调用 Generator函数并不会执行,也不会返回运行结果,而是返回一个遍历器对象(Iterator Object)
依次调用遍历器对象的next方法,遍历 Generator函数内部的每一个状态
12.新增了箭头函数
不能作为构造函数使用,不能用new
箭头函数没有原型
箭头函数没有arguments
箭头函数不能用call,apply,bind去改变this的执行
this指向的是外层第一个函数的this