ES6总结

ES6总结
全名:ECMAScript_6.0

变量类型与声明
基本数据类型:number、string、boolean、null、undefined

复合数据类型:array、object

获得类型:typeof

声明变量:var、let、const

var声明可以进行变量提升

let声明和var声明变量差不多,let通常用于语句块局部作用域{}

1.let声明的变量是局部变量在一对{}有效

2.let不能重复声明

3.let不会变量提升

const声明一个只读的常量,一旦声明,常量的值就不能改变,约定大写变量名

1声明必须赋值

2不能修改(值类型)数字字符串布尔

3建议变量名大写

Symbol类型
属性名唯一:由于每一个Symbol的值都是不相等的,所以Symbol作为对象的属性名,可以保证属性不重名。

常量值唯一:使用Symbol定义常量,这样就可以保证这一组常量的值都不相等

Symbol.for()类似单例模式,首先会在全局搜索被登记的Symbol中是否有该字符串参数作为名称的Symbol值,如果有即返回该Symbol值,若没有则新建并返回一个以该字符串参数为名的Symbol值,并登记在全局环境中供搜索。

Symbol.keyFor()返回一个已登记的Symbol类型值的key,用来检测该字符串参数作为名称的Symbol值是否已被登记。

注意:
Symbol函数前不能使用new命令,否则会报错因为生成的Symbol是一个原始类型的值,不是对象。由于Symbol值不是对象,所以不能添加属性。基本上,它是一种类似于字符串的数据类型。

Symbol函数可以接受一个字符串作为参数,表示对Symbol实例的描述,主要是为了在控制台显示,或者转为字符串时,比较容易区分。

Symbol值不能与其他类型的值进行运算,会报错。

Symbol值可以显式转为字符串

Symbol值也可以转为布尔值,但是不能转为数值

在对象的内部,使用Symbol值定义属性时,Symbol值必须放在方括号之中。

Symbol值作为属性名时,该属性还是公开属性,不是私有属性。

Symbol作为属性名,遍历对象的时候,该属性不会出现在for…in、for…of循环中,也不会Object.keys()、Object.getOwnPropertyNames()、JSON.stringify()返回

字符串
扩展的方法:
•includes():返回布尔值,判断是否找到参数字符串。
•trim():返回新的字符串,去除字符串的头尾空格
•startsWith():返回布尔值,判断参数字符串是否在原字符串的头部。
•endsWith():返回布尔值,判断参数字符串是否在原字符串的尾部。
•repeat():返回新的字符串,表示将字符串重复指定次数返回。
•padStart:返回新的字符串,表示用参数字符串从头部(左侧)补全原字符串。
•padEnd:返回新的字符串,表示用参数字符串从尾部(右侧)补全原字符串。

解构赋值
解构赋值是对赋值运算符的扩展。
解构的源,解构赋值表达式的右边部分。
解构的目标,解构赋值表达式的左边部分

数组模型的解构(Array)
lir
在这里插入图片描述
在这里插入图片描述

对象模型的解构(Object)
案例:在这里插入图片描述
数组方法
1.遍历数组forEach
2.映射数组map通过现有的数据反射出来新的数据一一对应
3.过滤filter现有数组通过一定的规则过滤出新的数组返回true保留false不保留
4.累计reduce方法接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值
5.一个 some检测数组元素中是否有元素符合指定条件返回true或者false只要回调函数有一个为true则整个都返回true
6.每个every检测数值元素的每个元素是否都符合条件返回true或者false回调函数都返回为true则整个都返回true
7.复制数组copywithIn(替换位置,拷贝开始,拷贝结束)方法用于从数组的指定位置拷贝元素到数组的另一个指定位置中
8.包含includes(obj)返回一个布尔值arr是否包含obj
9.查找 find返回通过测试(函数内判断)的数组的第一个元素的值查找元素
10.填充fill(内容,start,end)使用一个固定值来填充数组
案例:在这里插入图片描述
map和set
Set的属性和方法:
•Set.size:返回Set实例的成员总数。
•Set.add(value):添加某个值,返回Set结构本身。
•Set.delete(value):删除某个值,返回一个布尔值,表示删除是否成功。
•Set.has(value):返回一个布尔值,表示该值是否为Set的成员。
•Set.clear():清除所有成员,没有返回值。
•Set.keys():返回键名的遍历器
•Set.values():返回键值的遍历器
•Set.entries():返回键值对的遍历器
•Set.forEach():使用回调函数遍历每个成员

案例:
在这里插入图片描述
Map的属性和方法:
•Map.size:属性返回Map结构的成员总数。
•Map.set(key,value):设置键名key对应的键值为value,然后返回整个Map结构。如果key已经有值,则键值会被更新,否则就新生成该键。
•Map.get(key):get方法读取key对应的键值,如果找不到key,返回undefined。
•Map.has(key):has方法返回一个布尔值,表示某个键是否在当前Map对象之中。
•Map.delete(key):delete方法删除某个键,返回true。如果删除失败,返回false。
•Map.clear():clear方法清除所有成员,没有返回值。
•Map.keys():返回键名的遍历器。
•Map.values():返回键值的遍历器。
•Map.entries():返回所有成员的遍历器。
•Map.forEach():遍历Map的所有成员。

案例:在这里插入图片描述
在这里插入图片描述
函数
函数参数的扩展
1.默认参数
2.不定参参数不确定
3.拓展参数把数组展开当参数

案例
在这里插入图片描述
迭代器 for of
forin和forof

forin的特点:
for…in循环返回的值都是数据结构的键值名。遍历对象返回的对象的key值;遍历数组返回的数组的下标(key)。

for…in循环不仅可以遍历数字键名,还会遍历原型上的key值和手动添加的其他键;

特别情况下,for…in循环会以任意的顺序遍历键名总结一句:forin循环特别适合遍历对象。

forof特点:
forof循环用来获取一对键值对中的值,而forin获取的是键名一个数据结构只要部署了Symbol.iterator属性,就被视为具有iterator接口,就可以使用forof循环。

例3这个对象,没有Symbol.iterator这个属性,所以使用forof会报jsonisnotiterable

forof不同与forEach,它可以与break、continue和return配合使用,也就是说forof循环可以随时退出循环。

提供了遍历所有数据结构的统一接口;

for…of适用遍历数/数组对象/字符串/map/set等拥有迭代器对象的集合.但是不能遍历对象,因为没有迭代器对象.与forEach()不同的是,它可以正确响应break、continue和return语句

for-of循环不支持普通对象,但如果你想迭代一个对象的属性,你可以用for-in循环(这也是它的本职工作)或内建的Object.keys()方法:

生成器Generator
*用来表示函数为Generator函数,yield用来定义函数内部的状态

调用Generator函数和调用普通函数一样,在函数名后面加上()即可,但是Generator函数不会像普通函数一样立即执行,而是返回一个指向内部状态对象的指针,所以要调用遍历器对象Iterator的next方法,指针就会从函数头部或者上一次停下来的地方开始执行。

实现Iterator接口:为不具备Iterator接口的对象提供遍历方法 案例如下:
在这里插入图片描述
Reflect.ownKeys()返回对象所有的属性,不管属性是否可枚举,包括Symbol。

jane原生是不具备Iterator接口无法通过for…of遍历。这边用了Generator函数加上了Iterator接口,所以就可以遍历jane对象了。

类Class
在ES6中,class(类)作为对象的模板被引入,可以通过class关键字定义类。

它可以看作一个语法糖,让对象原型的写法更加清晰、更像面向对象编程的语法。

class的本质是function。

constructor构造函数:
constructor方法是类的默认方法,通过new命令生成对象实例时,自动调用该方法。一个类必须有constructor方法,如果没有显式定义,一个空的constructor方法会被默认添加。

原型和原型链
在JavaScript中,每当定义一个对象(函数也是对象)时候,对象中都会包含一些预定义的属性。

其中每个函数对象都有一个prototype属性,这个属性指向函数的原型对象。

每个对象都有__proto__属性,但只有函数对象才有prototype属性。

原型和原型链是JS实现继承的一种模型。

原型链的形成是真正是靠__proto__而非prototype

所有对象的__proto__都指向其构造器的prototype

所有函数对象的__proto__都指向Function.prototype,它是一个空函数(Emptyfunction)

Async和Await
async格式:
asyncfunctionname([param[,param[,…param]]]){
statements
}
name:函数名称。
param:要传递给函数的参数的名称。
statements:函数体语句。
async函数返回一个Promise对象,可以使用then方法添加回调函数。

await关键字仅在asyncfunction中有效。
如果在asyncfunction函数体外使用await,你只会得到一个语法错误。

await操作符用于等待一个Promise对象,它只能在异步函数asyncfunction内部使用。