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内部使用。