ECMAScript6概要

一 let与const

  1. let声明变量只在它所在的代码块中有效
  2. let不存在变量提升:只能先声明再使用变量
  3. 暂时性死区:只要块级作用域内存在let或const命令,它所声明的变量就不再受外部影响,即使在外定义了相同变量名的全局变量。
  4. 不允许重复定义变量
  5. 块级作用域:在块级作用域中可以定义函数(5不行),但函数作用范围与let相同
  6. do表达式:块级作用域没有返回值。let aaa = do{};则大括号里面内容有返回值赋给aaa。
  7. const声明一个只读变量,不可更改,所以const声明的变量必须立刻初始化。
  8. const的本质:变量指向的内存地址不可改变,如:const foo={};foo.prop=123;就可以改变

二 变量的解构赋值

  1. 例:let [a,b,c] = [1,2,3]; //a=1,b=2,c=3
  2. 不仅可以用于数组还可以用在对象:let {foo,bar} = {foo:’aaa’,bar:’bbb’}

三 字符串的扩展

  1. includes():返回布尔值,表示是否找到了参数字符串
  2. startsWith():返回布尔值,表示参数字符串是否在源字符串的头部
  3. endsWith():返回布尔值,表示参数字符串是否在源字符串的尾部
    以上三种都支持第二参数,表示开始搜索的位置(endwith与其他两个相反,参数指的是前xx个字符,第一个字符为1)
  4. repeat():返回一个新字符,表示为原字符重复了n次。例:x.repeat(3)
  5. padStart(),padEnd():字符串补全长度,两个参数:第一个指定字符串最小长度,第二个指定用来补全的字符串。如果第二个参数省略则用空格补全。
  6. 模板字符串:用前后两个(`)做标识,变量和js表达式和函数放在($())内。
  7. 模板编译函数:compile()

四 数值的扩展

  1. Number.isNaN()和Number.isFinite():判断数值是否为nan/有限,如果是非数值一律为false
  2. Number.parseInt()和Number.parseFloat():将原先的全局对象移植到Number对象。
  3. Number.isInteger():判断一个数值是否为整数。
  4. Number.EPSILON():Number对象上增加的一个极小常量。
  5. Number.isSafeInteger():判断是否超出js数字最大范围。
  6. Math.trunc():用于去除一个数的小数部分,返回其整数部分。
  7. Math.sign():用来判断一个数是正数、负数还是零。(正数返回1,负数-1,0两种情况,其它值返回NaN)
  8. Math.cbrt():用于计算一个数的立方根。
  9. Math.clz32():返回一个数的32位无符号整数形式有多少个前导零。
  10. Math.imul():计算大数值相乘时更为精确。
  11. Math.fround():返回一个数的单精度浮点数形式。
  12. Math.hypot():返回所有参数平方和的平方根。
  13. Math.expm1(x):返回e的x次方减1。
  14. Math.log1p(x):返回1+x的自然对数。以e为底。
  15. Math.log10(x):返回以10为底的x的对数。
  16. Math.log2():同上
  17. **:指数运算符。

五 数组的扩展

  1. Array.from():将类似数组的对象(有length属性)和可遍历对象转化为真正的数组。他还可以接受第二参数,作用类似map方法,用来对每个元素进行处理,将结果放回数组。
  2. Array.of():将一组值转化为字符串,对比Array()可以生成小于两个参数的数组。
  3. copyWithin():将指定位置的成员复制到其他位置(会覆盖原有成员),并返回当前数组。
    三个参数:第一个:从该位置替换数据,第二个:从该位置开始读取数据,第三个:到该位置前停止读取,默认等于数组长度。
  4. find():他的参数是一个回调函数,找到第一个返回true的成员,返回该成员。没找到返回undefined。
  5. findIndex():同上,返回该成员的索引,没有找到返回-1。
  6. fill()方法:使用给定值,填充一个数组。第二第三个参数分别是起始位置和结束位置。
  7. entries(),keys(),values()方法:用于遍历数组,key对键名的遍历,values对键值的遍历,entries对键值对的遍历。(一般使用for…of遍历)
  8. includes()方法:返回一个布尔值,表示数组是否包含有给定值。与has方法区别:may的has用来查找键名,set的has用来查找键值

六 函数的扩展

  1. 函数默认值:function aaa(x,y=”bbb”){};
  2. 函数的length属性:指的是函数参数的个数,如果参数设置了默认值,则该参数以及其后的参数都不计入length中。
  3. 函数声明初始化时,参数会形成一个单独的作用域,不设置参数默认值时则不出现。
  4. rest参数:语法:…变量名。将多余参数化作数组。例:

    function add(…values) {
      let sum = 0;
      for (var val of values) {
        sum += val;
      }
      return sum;
    }
    add(2, 5, 3) // 10

  5. 扩展运算符:语法:…数组。与rest参数相反,将一个数组转为用逗号分隔的参数序列
    用处:一 替代apply方法:aaa(…[1,2,3]) 等同于 aaa.apply(null,[1,2,3])
    二 合并数组:[1,2,…more]
    三 字符串转为数组:[…’hello’]——可以识别32位unicode字符

  6. 函数name属性:函数的name属性,返回该函数的函数名

  7. 箭头函数:语法:函数名 = 参数值 => 返回值。如果返回值多于一条语句则用{}括起并用return返回返回值。由于{}解释为代码块所以当返回对象{}的话要用()括起。

七 对象的扩展

  1. Object.is():同值相等判断,基本等于===,不同于其NaN等于自身,+0不等于-0
  2. Object.assign():将源对象所有可枚举属性加入目标对象。第一个参数为目标对象,后面的参数全为源对象。
  3. 可枚举属性(enumerable):值为布尔值。for…in等操作会忽视不可枚举属性(false)
  4. 对象属性的遍历:
    1. for…in:循环遍历对象自身的和继承的可枚举属性
    2. Object.keys(obj):返回一个数组,包括对象自身的(不含继承)所有可枚举属性的键名。
    3. Object.getOwnPropertyNames(obj):返回一个数组,包含对象自身的所有属性。
    4. Object.getOwnPropertySymbols(obj):返回一个数组,包含对象自身的所有Symbol属性
    5. Reflect.ownKeys(obj):返回一个数组,包含对象自身的所有属性
      1到3条都不返回Symbol属性,4,5条则都会返回。
  5. proto属性,Object.setPrototypeof(),Object.getPrototypeOf():前两个作用相同,用来设置一个对象的prototype对象,返回参数对象本身。(第一个参数为对象,第二个为原型)
    第三个方法用于读取一个对象的原型对象
  6. Object.keys():返回一个数组,包括对象自身的(不含继承的)所有可枚举属性的键名。
  7. Object.values():返回一个数组,包括对象自身的(不含继承的)所有可枚举属性的键值。
  8. Object.entries():返回一个数组,成员是参数对象自身的(不含继承的)所有可枚举属性的键值对数组。
    以上三种主要搭配for…of使用。例:for(let [k,v] of Object.entries(xxx)){}
  9. Object.getOwnPropertyDescriptors():返回某个对象属性的描述对象。即返回不显式注明的enumerable等属性。
  10. Null传导运算符(?.):读取对象内部属性时使用。例:let fn = mes?.body?.user || ‘default’
    只要任一个属性不存在则不再运算,返回undefined。

八 Symbol

  1. 他是js语言的第七种数据类型,用来表示独一无二的值。
  2. Symbol值通过Symbol函数生成。例:let s = Symbol()。该函数可以接受一个字符串作为参数,用来表示对Symbol实例的描述。
  3. 使用Symbol值定义属性时,Symbol值必须放在方括号中。否则就代表了字符串而非Symbol值
  4. Symbol.for():接受一个字符串作为参数,然后搜索是否有以此参数为名的Symbol值。如果有,返回这个值,否则新建并返回一个以该字符串为名称的Symbol值。
  5. Symbol.keyFor():返回一个已登记Symbol值得key。例:var s1 = Symbol.for(‘foo’);
    symbol.keyFor(s1) // “foo”
  6. Symbol具体的各种属性:…

九 Set和Map数据结构

  1. Set是一种新的数据结构。类似于数组,但成员都是唯一的值。语法:var s = new Set();
  2. 向Set加入值得时候不会发生类型转换。另外两个对象总是不相等的。
  3. Set实例的属性和方法:属性:Set.size:返回set实例的成员总数。
    方法:Set.add():添加某个值,返回Set结构本身。Set.delete():删除某个值,返回一个布尔值,表示删除是否成功。Set.has():返回一个布尔值,表示该值是否为Set的成员。Set.clear():清除所有成员,没有返回值。
  4. Array.from()方法可以将Set结构转化为数组。
  5. WeakSet:结构与Set类似,也是不重复的值的集合。不同1:它的成员只能是对象。不同2:它之中的对象都是弱引用,因此它是不可遍历的。
  6. WeakSet的三个方法:.add() .delete() .has() 作用与set的对应方法类似
  7. Map结构:类似于对象,也是键值对的集合,但key的范围不限于字符串。也就是说Object结构提供了字符串-值得对应。map结构提供了值-值的对应。
  8. map的属性和操作方法:
    属性:size:返回Map结构的成员总数。
    方法:set(key,value):设置key所对应的键值,然后返回整个Map结构。
    get(key):读取key对应的键值。has(key): delete(key): clear():
  9. map的遍历:默认遍历接口entries。keys()、values()、entries()、forEach()。其中map的forEach方法接受第二参数,用来绑定this。即它的回调函数的this只想第二个参数。
  10. 与其他数据结构的互相转换
    1. 数组:[…map]
    2. 数组到map:new Map([xxx,xxx,xxx])
    3. 对象:如果map的键全为字符串,则可以转化为对象。
    4. 对象到map:与3相反就行了。
    5. JSON:键名是字符串先转化为对象再用JSON.stringify()转化。键名不是字符串,可以选择转为数组JSON:JSON.stringify([…map])
    6. JSON到map:先转化为对象或数组,再转化为map结构(JSON.parse())
  11. WeakMap:与map结构区别:只接受对象作为键名,且不计入垃圾回收机制,不可遍历。最后,他无法被清空。

十 Proxy和Reflect

  1. 先跳过

十一 Promise对象

  1. Promise对象是一个构造函数,用来生成Promise实例,用来保存某个未来才会结束的事件如一个异步操作。语法:

    var promise = new Promise(function(resolve,reject){
    if(异步操作成功:200){resolve(value)}else{reject(error)}
    })

  2. promise实例的两个参数resolve和reject是两个函数,作用是将对象状态从未完成变为成功或失败。
  3. Promise实例的then方法:指定resolved状态和reject状态的回调函数。promise实例在新建后就立刻执行,then则是在执行完当前脚本所有的同步任务后再输出。
  4. catch方法:用于指定发生错误时的回调函数。一般来说,不在then方法里定义reject回调函数,而用catch。因为状态改变后就不再抛出错误,也无法被catch捕获了。
    如果没用catch方法指定错误处理的回调函数,Promise实例的错误则不会有任何反应
  5. all方法:语法:var p = Promise.all([p1,p2,p3]);
    它接受一个数组作为参数,将多个Promise实例,包装成一个新的Promise实例。
    p的状态由p1、2、3决定,只有全fulfilled,p才会fulfilled。只要有一个rejected,p就rejected。
    例子:

    var promises = [2, 3, 5, 7, 11, 13].map(function (id) {
      return getJSON(“/post/“ + id + “.json”);
    });
    Promise.all(promises).then(function (posts) {
    }).catch(function(reason){
    });

  6. race方法:与all方法相同将多个Promise实例,包装成一个新的Promise实例。
    p的状态只要有一个实例率先改变状态,p的状态就改变。
  7. resolve方法:将现有对象转化为Promise对象。基本都是转化为resolved状态的promise实例,并立刻执行回调函数。
  8. reject方法:与上面方法相同,不同的是promise实例的状态为rejected

十二 Iterator和for…of循环

  1. Iterator:所有部署了Symbol.iterator属性的数据结构。
  2. Iterator对象除了next方法,还有return和throw方法
    return函数当for…of循环提前退出时调用(必须返回对象)
    throw方法一般用不到
  3. for…in只能获得键名,for…of允许遍历获得键值

十三 Generator函数的语法

  1. Generator函数语法:一:function关键字与函数名之间有一个 * 二:函数体内部使用yield语句,定义不同的内部状态。
  2. Generator函数调用方法与普通函数相同,但调用后不执行,返回的也是一个遍历器对象。
  3. 需要调用函数必须调用next方法,使指针移向下一个状态。即yield语句是暂停标记,next可以恢复执行。yield与return差别在于它具有记忆位置的功能,下个next会从之前一个yield开始。用过next方法以后返回一个对象,其value属性为yield之后的表达式的值,done属性为函数有没有结束。
  4. yield只能用在generator函数中。且如果要用在表达式中必须用括号括起。
  5. next方法如果带参数则参数就为上一个yield的值。
  6. for…of循环遍历Generator函数:不需要调用next,当done属性为ture循环结束。例如用了return语句。
  7. throw方法:try/catch
  8. return方法:返回值并终结generator函数使其done属性变为true,以后再调用next,done属性也总返回true。如果函数内有try…finally代码块,则return会推迟到该代码块加载完在执行
  9. yield语句:默认情况下无法再Generator函数内调用另一个Generator函数,而用`yield`语句后则可以跟Generator函数
  10. Generator函数的this:G函数的总是返回一个遍历器,this函数无法指向该函数。要设定函数内属性要用G.prototype。他也不能用new命令,因为他不是构造函数。要获得正常的this需要用call方法绑定G函数内部的this。例:var f = F.call(F.prototype)。这样就能取到函数内的this了。

十四 Module的语法

  1. export命令:可以输出变量,类和函数。可以用as关键字重命名。
  2. import命令:接受一对大括号,里面指定要从其他模块导入的变量名。也可以用as来重命名
  3. 模块整体加载:import * from
  4. export default命令:为模块指定默认输出。import可以任意命名。
  5. export与import的复合写法:即先输入后输出同一模块。export {} form ‘’
  6. 模块的继承:export * from 'circle'。表示再输出circle模块的所有属性和方法。注意,export *命令会忽略circle模块的default方法。
  7. 跨模块常量:export const A = xxx;多个常量的话:export const db = {url:xxx,name:aaa}