ES6

1、let和const命令
2、变量的解构赋值
3、字符串的扩展
4、数值的扩展
5、正则的扩展
6、数组的扩展
7、函数的扩展
8、对象的扩展
9、symbol
10、proxy和reflect
11、二进制数组
12、set和map数据结构
十3、iterator和for...of循环
十4、generator函数
十5、promise对象
十6、异步操做和async函数
十7、Class
十8、修饰器 (ES7 但babel支持)
十9、module
二10、编程风格[可参阅jscs.info]
 
1、let和const命令
    1.一、let
            {
                let a = 10;
            }
        仅在代码块中使用有效;
        不存在变量提高:须要在声明后使用;
        暂时性死区:只要块级做用域内存在let,其变量便绑定了该区域,不受外部影响;
        不容许重复声明:不容许相同做用域声明同一个变量;
 
    1.二、块级做用域
        因为不存在变量提高,块级做用域之间的元素互不影响。
 
    1.三、const命令
        声明常量,一旦声明,其值不能改变;
        只有声明所在的块级做用域有效;
        不存在变量提高,有暂时性死区;
        对于对象、数组等指针型变量,不能改变的是指针,而非内部内容,若是须要防止内容的改变,使用object.freeze方法。
 
    1.四、跨模块的常量
    // constants.js 模块
        export const A = 1; 
        export const B = 2;
        export const C = 3;
    // test1.js  模块
        import * as constants from ‘./constants’;
        console.log(constants.A);
     // test2.js  模块    
        import {A, B} from ‘./constatns’;
        console.log(A);
 
    1.5 全局对象属性
        window下,全局对象为window;nodejs环境下指的global对象。
        ES6下,var、function命令声明的仍为全局变量;let、const、class命令不属于全局对象属性。
 
2、变量的解构赋值
    2.1 数组的解构赋值
        [a, b, c, d] = [1, 2, 3, 4],这种属于“模式匹配”,只要等号两边的模式相同,左边的变量就会被赋予对应的值。
        [head, …tail] = [1, 2, 3, 4] // head == 1; tail == [2, 3, 4]
        若是解构不成功,则会赋值undefined
        默认值:[x = 1, y] = [2, 3] or [x = f(), y] = [2, 3];若是默认值为表达式,仅在使用时,才会执行表达式。
 
    2.2 对象的解构赋值
        对象按照属性名取值,数组按照次序取值。
        var {foo: baz, bar: tr} = {foo:’aaa’, bar: ‘bbb’};真正被复制的是baz,而非foo;
        {x} = {x:1} //容易出错,通常会解析成代码块,最佳方式:({x}={x:1})
 
    2.3 字符串的解构赋值
        const [a, b, c, d, e] = ‘hello’;// a=‘h’,b=‘e’…
        let {length: len} = ‘hello’;// len = 5;
 
    2.4 数值与布尔值的解构赋值
        若是右边是数值或布尔值,会先转换成对象。
 
    2.5 函数参数的解构赋值
         undefined会触发函数参数的默认值。
        [1, undefined, 3].map((x = ‘yes’) => x) // [1, ‘yes’, 3]
 
    2.6 圆括号问题
        解析结构是表达式仍是模式不容易,因此不要在模式中放置圆括号。
 
    2.7 用途
        a、交换变量
        b、函数返回多个值
        c、函数参数的定义
        d、提取json数据
        e、函数参数的默认值
        f、遍历map结构
 
3、字符串的扩展
    ES6增强了对Unicode的支持,而且扩展了字符串对象。
    javascript容许采用\uxxxx形式表示一个字符,其中xxxx表示字符的码点。
    3.1 字符的Unicode表示法
 
    3.2 codePointAt() 能够判断字符是否为4个字节,返回字符对应的码点
 
    3.3 string.fromCodePoint()  参数为码点,可返回字符值
 
    3.4 字符串的遍历器接口
        for (let codePoint of ‘foo’) {
            // ‘f’, ‘o’, ‘o’    其可自动识别四个字节的字符
        }
 
    3.5 at() 可返回四个字节的字符(汉字) 等价两字节的charAt()。
 
    3.6 normalize() 将字符的不一样表示方法统一为一样的形式。
 
    3.7 includes(), startsWith(), endsWidth() 表示是否找到参数字符串,返回布尔值
 
    3.8 string.repeat(n) 表示将原字符串重复n次
 
    3.9 padStart, padEnd,用来补全字符串
        ‘x’.padStart(5, ‘ab’) //ababx  接受两个参数,第一个为总长,第二个为重复的字符。
 
    3.10 模板字符串
        使用反引号标识,嵌入变量${}
        $(‘#result’).append(’there are <b>${count}</b>items.’);
 
    3.11 模板编译
 
    3.12 标签模板
        可以使用其嵌入其余语言,如jsx。
         函数调用的一种特殊形式,标签指函数,紧跟其后的模版字符串是参数。
        tag`hello ${a + b} world ${a * b}` => function tag([‘hello’, ‘ world’, ‘’], 15, 50)
 
    3.13 string.raw() 充当模板字符串的处理函数,返回一个反斜线都被转移的字符串。
        
4、正则的扩展
    4.1 RegExp构造函数 new RegExp(/abc/ig, ‘i’).flag // ‘i’
 
    4.2 将四个正则方法:match、replace、search、split四个方法都定义在了RegExp的对象上
 
    4.3 u修饰符 为正则添加了u修饰符,含义为’unicode模式’
        a、点字符 .表示任意字符,对于四字节字符,没法匹配,配合修饰符u,可正确判断。
        b、unicode字符表示法 新增了大括号表示Unicode字符 /u{61}/u.test(‘a’)
        c、量词 /接{2}/u.test('接’) //true
        e、预约义模式/^\S$/u.test(‘接’) // true
        f、i修饰符
 
    4.4 y修饰符 ‘粘连’修饰符 与g功能相同,不一样之处y默认带^,下一位置就必须可以匹配上。
 
    4.5 sticky属性 表示是否设置了y修饰符 var r = /hello/y;  r.sticky // true
 
    4.6 flags属性 返回正则的修饰符
 
    4.7 RegExp.escape() 还未经过审核
 
5、数值的扩展
    5.1 二进制和八进制数值表示法
        0b || 0B 为二进制; 0o || 0O表示八进制
 
    5.2 Number.isFinite(), Number.isNaN() 分别用来检查 Infinite 和 NaN这两个特殊值。
        传统的这两个方法,会先调用Number()转为数字,在判断;而新方法不转换,直接判断。
 
    5.3 Number.parseInt(), Number.parseFloat() 其行为不变,只是移植到了Number对象上。
 
    5.4 Number.isInteger()用来判断是否为整数,3和3.0视为同一值。
 
    5.5 Number.EPSILON 一个极小的常量,为了减少浮点数相减的偏差而设,若是偏差小于这个常量,则正确。
        5.5545656563e-17 < Number.EPSILON
 
    5.6 安全整数和Number.isSafeInteger()  
        ES6提供了两个常量,Number.MAX_SAFE_INTEGER和Number.MIN_SAFE_INTEGER
 
    5.7 Math对象的扩展
        增长了17个与数学相关的方法。
        a、Math.trunc() 去除数字的小数部分,返回整数部分。
        b、Math.sign() 判断一个数是正数、负数仍是零,+1正数;-1负数;+0; -0; NaN
        c、Math.cbrt() 计算一个数的立方根
        d、Math.clz32() 返回一个32位无符号整数形式(使用二进制表示的)有多少个前导0
        e、Math.imul() 返回两个数以32位带符号整数相乘的结果
        f、Math.fround() 返回一个数的单精度浮点数形式
        g、Math.hypot() 返回全部参数的平方和的平方根
        对数方法:
        h、Math.epm1(x) 返回e^x-1
        i、Math.log1p(x) 返回 1/ln(1+x)
        j、Math.log10(x) 返回10为底的x的对数 Math.log10(10000) //4
        k、Math.log2(x) 返回以2为底x的对数
        三角函数方法:
        l、Math.sinh(x)   返回x的双曲正弦
        m、Math.cosh(x) 返回x的双曲余弦
        n、Math.tanh(x)    返回x的双曲正切
        o、Math.asinh(x)    返回x的反双曲正弦
        p、Math.acosh(x)    返回x的反双曲余弦
        q、Math.atanh(x)    返回x的反双曲正切
  5.8 指数运算符 **
   2 ** 3 = 8
 
6、数组的扩展
    6.一、Array.from() 将两类对象转换成真正的数组:类数组的对象及可遍历的对象(即必须有length属性)
        如dom操做的nodeloost集合、函数内部arguments对象及ES6的Set和Map方法
        document.querySelectorAll(‘p’)
        tips: 运算符...也可将某些结构转换成数组;from能正确的识别unicode字符
        Array.from(spans, s => s.textContent);其转换数组的同时,具有map的功能。
 
    6.二、Array.of()
        用于将一组值转换为数组。Array.of(3, 11, 8) // [3, 11, 8]
 
    6.三、copyWithin(target, start = 0, end = this.length)
        将数组内部指定位置的成员复制到其余位置上
 
    6.四、find()和findIndex()
        find找出第一个符合条件的数组成员,返回成员或者undefined
        [1, 4, -5, 10].find((n) => n<0) //-5
        findIndex()与上同,返回成员位置,不然返回-1
 
    6.五、fill(x, start, end)
        填充数组[‘a’, ‘b’].fill(7, 1, 2) // [‘a', 7]
 
    6.六、 entries()、keys()、values() 
        用于遍历数组,返回一个遍历器对象,可用for..of遍历
        entries为遍历键值对;keys为遍历键值;values为遍历值
        for (let [index, elem] of [‘a’, ‘b’].entries()) // 0 ‘a’
 
    6.七、includes(x, start, end)
        返回一个布尔值,表示某个数组是否包含给定的值
 
    6.八、数组的空位
        [, , ,]空位不表明undefined
        ES5对空位的处理不一致,而ES6进行统一,将空位都转换为undefined,空位不会被忽略掉。尽可能避免空位出现。
 
    6.九、数组推导
        var a1 = [1, 2, 3,4];
        var a2 = [for (i of a1) i* 2]; //[2, 4, 6, 8]
        var a3 = [for (i of a1) if (i > 2) i]; //[3, 4]
        其可替代map()及filter()方法
 
7、函数的扩展
    7.一、函数参数的默认值
         function log(x, y = ‘hello’){}
        a、参数的解构赋值:重点区分参数的默认值与解构赋值的默认值。
        b、默认参数:非显示的输入undefined,触发该参数等于默认值,null没有这个效果。
        c、length属性:指定默认值的参数,不计入length,致使length失真。
        d、做用域:当前函数做用域与全局做用域
            try catch err throw
 
    7.二、rest参数 “…变量名”
        rest参数搭配的变量是一个数组,将多余的参数放入其中;rest参数以后不能再有参数。
 
    7.三、扩展运算符
        ‘…’,将一个数组转为用逗号分隔的参数序列。
        a、替代apply()
        b、合并数组:[1, 2, …more]
        c、与解构赋值结合:[1, 2, …rest] = list;     
            tips:扩展运算符用于数组赋值时,只能放在末尾。
        d、字符串:[…’hello’] //[‘h’, ‘e’, ‘l’, ‘l’, ‘o’]
            可正确返回字符的长度(可识别unicode字符);[...string].length
        e、类数组对象:可转变成数组.
 
    7.四、name属性
        function foo(){} foo.name // “foo"
 
    7.五、箭头函数
        使用箭头定义函数;
        a、var f = v => v;  等同于 var f = function(v) {return v};
        b、函数不须要参数或者须要多个参数,就用()代替:
             var f = () => v;  等同于 var f = function(a, b) {…… return v};
        c、因为大括号被解析成代码块,若是须要返回对象,须要加上括号:
            var fun = id => ({id: id, name: ‘hity’});
        d、若是代码块多余一条语句,就须要用大括号包起来。
        e、嵌套箭头函数
        tips:
            a、函数体内的this,是定义时的对象,而非运行时;
            b、不可当构造函数;
            c、arguments对象不存在,可用rest参数代替;
            d、不可以使用yield命令,没法用做generator函数;
            e、箭头函数无本身的this做用域,this指向父级this;因此没法使用apply、call、bind改变this指向
            f、无arguments、super、new.target;
 
    7.六、函数绑定
            ‘::’能够将左边对象做为上下文绑定到右边的函数上。能够采用链式的写法,返回的仍是原对象。
 
    7.七、尾调用优化
            概念:指某个函数的最后一步是调用另一个函数:function f(x){ return g(x);}
            尾调用优化,去掉外层的调用帧。
                tips:仅当内部函数不须要使用外部函数的变量时,优化才会进行。
            尾递归:递归很是消耗内存,将其转变为尾递归将只有o(1)的复杂度。
                tips:尾递归仅严格模式下可用:“use strict”,这种状况下函数的信息都将移除~
  
8、对象的扩展
    8.一、属性的简洁表示法
        {x, y} == {x: x, y: y};
        var obj = {
            birth,
            method() {
                return ‘hello';
            }
        }
 
    8.二、属性名表达式
        let obj = {
            [prop]: true,
            [‘a’ + ‘b’]: 123
        }
 
    8.三、方法的name属性
        (new Function()).name //anonymous
        bind创造的方法,name属性返回“bound”加原函数名。
 
    8.四、Object.is()
        比较两个值是否严格相等。与 === 基本一致。(+0, -0)//false  (NaN, NaN)// true
 
    8.五、Object.assign(targetObj, srcObj)
        做用:将srcObj的全部可枚举对象复制到targetObj上;其只复制自身属性,不可枚举的和继承的不会被复制。
 
    8.六、属性的可枚举性
        object.getOwnPropertyDescriptor(obj, ‘foo’);
        // {value: 123, writable: true, enumerable: true, configurable: true}
        有三个操做会忽略enumerable为false的属性:
            a、for…in:遍历自身和继承的可枚举属性;
            b、Object.keys():返回对象自身的可枚举属性键名;
            c、JSON.stringify():串行化对象自身的可枚举属性;
            d、Object.assign():复制自身可枚举的属性;
            e、Reflect.enumerate():返回全部for...in循环会遍历的属性
        tips:全部Class的原型的方法都不可枚举。
 
    8.七、属性的遍历
        ES6共6种方法遍历对象的属性:
        for…in:(无symbol)
        Object.keys():(无symbol)
        Object.getOwnPropertyNames(obj):返回数组,包含对象自身全部属性(无symbol)
        Object.getOwnPropertySymbols(obj):返回数组,包含对象自身的全部symbol属性
        Reflect.ownKeys(obj):返回数组,包含对象自身全部的属性
        Reflect.enumerate(obj):返回一个Iterator对象,遍历对象自身和继承全部可枚举属性(无symbol)
 
    8.八、__proto__属性、Object.setPrototypeOf()、Object.getPrototypeOf()
        __proto__属性用来设置、读取当前对象的prototype对象;但最好不用,而是使用object.setPrototypeOf(object, prototype)、object.getPrototypeOf()、object.create()代替。
 
    8.九、对象的扩展运算符
        rest亦可用于对象,使用方法相同。
        tips:
            a、其为浅复制,若是一个键的值为复合类型,则复制这个值的引用。
            b、不能复制继承自原型对象的属性。
            c、rest对象中存在取值函数get,这个函数会当即执行。
 
9、symbol
    9.一、概述
        引入的缘由:解决扩展他人对象属性时的命名冲突。
        javascript的第7种数据类型为:symbol,属性名属于symbol就是独一无二的。
        tips:symbol值不能与其余值运算,它不能添加属性,相似字符串。
             symbol值可转为字符串、布尔值;
 
    9.二、做为属性名的symbol
        a {[mySymbol]:  ‘hello’}
 
    9.三、消除魔术字符串
        指在代码之中屡次出现、与代码造成强耦合的某一个具体的字符串或者数字。
 
    9.四、属性名的遍历
        能够设置一些非私有又但愿仅内部使用的方法。
 
    9.五、symbol.for(), symbol.keyFor()
        symbol.for(name):查找对应的symbol,查到则返回,并登记在全局中,不然建立一个新的symbol。
        symbol.keyFor(s1):返回已登记的symbol key(即name)。
 
    9.六、内置的symbol值
        
10、Proxy和Reflect
    proxy代理,能够理解成目标对象前架设一“拦截”层,外界访问必须先经过该拦截。
    new Proxy(target, handle);
    10.一、实例方法
        a、get():用于拦截某个属性的读取操做;
        b、set():用于拦截某个属性的赋值操做;
        c、apply(): 用于拦截函数的调用、call和apply操做;
        d、has(): 用于隐藏某些操做,不被in操做符发现;
        e、construct(): 用于拦截new命令;
        f、deleteProperty: 用于拦截delete操做,使得属性不被delete;
        g、defineProperty:用于拦截object.defineProperty(添加新属性)操做;
        h、enumerate():用于拦截for...in循环;
        i、getOwnPropertyDescriptor():用于拦截object.getOwnPropertyDescriptor;
        j、getPrototypeof():用于拦截其运算,以及其余一些操做;
        k、 isExtensible():用于拦截其操做;[若是对象是可扩展的(这表示可向对象添加新属性),则为 true;不然为 false。]
        l、ownKeys():用于拦截object.keys操做;
        m、preventExtensions():用于拦截其操做,必须返回布尔值;
        n、setPrototypeOf():用于拦截其方法。
 
    10.二、proxy.revocable()
        返回一个可取消的proxy实例。
 
    10.三、reflect概述
        其设计目的:
        a、将object上明显属于语法层面的方法放到reflect上;
        b、修改某些object的返回结果,让其变得更合理;
        c、让object操做都变成函数行为;
        d、reflect对象的方法与proxy对象的方法一一对应,这样能够直接让proxy对象调用reflect对象完成默认行为。
 
11、二进制数组(大略的过,须要理解内存之类的计算机原理等)
    设计目的:为了让开发者可以经过javascript与操做系统的原生接口进行二进制通讯。
    二进制数组分三类:
    a、arrayBuffer对象:表明原始的二进制数据;
    b、typedArray视图:用于读写简单类型的二进制数据;
    c、dataView视图:用于读写复杂类型的二进制数据。
    typedArray有九种类型数据:int八、uint八、uint8C、int1六、uint1六、int3二、uint3二、float3二、float64
    dataView有除uint8C外的八种数据类型。
    API用到了二进制数组操做二进制数据的有一下浏览器:
        File API、XMLHttpRequest、Fetch API、Canvas、WebSocket
 
    11.一、arrayBuffer对象
        var buf = new ArrayBuffer(32);
        arrayBuffer.prototype.byteLenth:因为分配内存的操做不必定成功,因此须要经过该字段来判断是否成功;
        arrayBuffer.prototype.slice():容许将内存区域的一部分复制生成一个新的arrayBuffer对象;
        arrayBuffer.isView():返回布尔值,表示参数是否为arrayBuffer的一个试图实例。
 
    11.二、typedArray视图
        其有九个构造函数,对应不一样的数据类型;
        造成的数组成员都是一种类型;
        成员都是连续的,不会有空位;
        默认值为0。
 
    11.三、dataView视图
 
    11.四、二进制数组的应用
        a、ajax 返回的类型能够为二进制,设置为arraybuffer or blob;
        b、canvas 类型值为uint8clampedarray
        c、websocket 经过arraybuffer发送或者接收二进制数据;
        d、fetch API 取回的数据为arrayBuffer对象;
        e、file API 若是知道文件为二进制数据类型,也能够将其读取为arrayBuffer对象。
 
12、set和map数据结构
    12.一、set
    set是一种新的数据结构,其与数组的区别是,没有重复值,成员值都惟一。set自己为构造函数。
    set接受一个数组做为参数,var set =new Set([1, 2, 3, 4, 4]); // [1, 2, 3, 4]。
    set加入的值,不会进行类型转换,判断相等使用的是 ===。 
    set实例的属性和方法:
        set.prototype.size: 返回set成员的总数;
        add(value): 添加某个值,返回set结构自己;
        delete(value):删除某个值,返回一个布尔值;
        has(value): 返回一个布尔值;
        clear():清除全部成员,没有返回值。
    遍历方法:keys()、values()、entries()、forEach()
 
    12.二、weakSet
        为不重复的值的集合,与set的区别:
            a、其成员只能是对象;
            b、其对象为弱对象,垃圾回收机制不考虑它的引用,所以,它是不可遍历的。
        方法:add()、delete()、has();
        其用处为:储存DOM节点,而不用担忧这个节点从文档中移除时会发生内存泄漏。
 
    12.三、map
        map相似对象,区别在于键不一样,对象的键限制只容许字符串,map的键不受限:
            对象为“字符串-值”的对应,map为“值-值”的对应。
        须要堤防一种状况,键为引用地址的状况:如
            map.set([‘a’], 123);
            map.get([‘a’]); // undefined
            因为数组做为键时,标记的是数组所在的引用地址。
            var k1 = [‘a’];
            map.set(k1, 1234);
            map.get(k1) // 1234
        map的键是跟内存绑在一块儿的,只要内存地址不同,就视为两个键。如此解决了同名属性碰撞的问题。
        map的属性和方法:
            size属性:返回成员总数;
            set(key, value):设置键值,并返回整个map的结构;
            get(key):读取key对应的值,找不到则返回undefined;
            has(key):返回布尔值,确认键是否存在;
            delete(key):删除某个键,返回布尔值;
            clear():清除全部成员,没有返回值。
        遍历方法:keys()、values()、entries()、forEach()。
        可以使用运算符(...)转换成数组。
        转换:
            a、map转数组(…)
            b、数组转map;
            c、map转对象;
            d、对象转为map;
            e、map转为son(键名为字符串);
            f、json转为map(键名为字符串)。
 
    12.四、weakmap
        weakmap与map相似,但其只接受对象做为键名,键名指向的对象不计入垃圾回收机制。其有助于内存泄漏。
 
十3、iterator和for...of循环
    iterator接口为各类不一样的数据提供统一的访问机制。只要部署iterator接口,就可完成遍历操做。
    做用:
        a、为各类数据结构提供统一的、简便的访问接口;
        b、使得数据结构的成员可以按照某种次序排列;
        c、es6创造了一种新的遍历命令for...of循环,iterator接口主要供其消费。
    遍历过程:
        step一、建立指针对象,指向当前数据结构的起始位置;
        step二、第一次调用指针对象的next方法,指向第一个成员;
        step三、第二次调用next方法,指向第二个成员;
        step四、不断调用,直到结束。
    step2时,会返回数据结构当前的成员信息;具体是返回一个包含value和done的对象,value为成员值,done为布尔值,表示遍历是否结束。
    iterator接口须要经过symbol.iterator来部署。
 
    13.三、调用iterator接口的场合
        解构赋值、扩展运算符、其余场合:for...of、array.from()、map()、set()、weakmap()、weakest()、promise.all()、promise.race()。
 
    13.四、字符串的iterator接口
        var string = “lala”;
        var iterator = string[Symbol.iterator]();
        修改遍历器对象。
 
    13.五、iterator接口与generator函数
        Symbol.iterator方法最简单的实现仍是generator函数。
 
    13.六、遍历器对象的return()、throw()
        next方法是必须部署的方法,return方法用于for...of循环提早退出时(break、continue或者出错),调用。return方法必须返回一个对象。throw方法配合generator使用。
 
    13.七、for...of循环
        一个数据结构只要部署了Symbol.iterator属性,就能够用for...of循环遍历其成员。
        for… in、for…of
        数组、set、类数组对象[string]:for (let v of arr)
        map:for (var [name, value] of  es6)
 
十4、generator函数
    14.一、简介
        基本概念:Generator函数为ES6提供的一种异步编程解决方案,语法行为与传统函数彻底不一样。
        Generator是状态机,也是遍历器对象生成器,返回一个遍历器对象。它的两个特征:a、function命令与函数名之间有一个星号;b、内部使用yield定义内部状态。最大特色,暂缓执行函数;经过next作暂缓和停顿。
        其调用后,不执行,而是返回一个iterator对象,需用next方法调用,才执行。
        yield语句没法用在普通函数中,不然出错;且用于表达式中时,须要放在圆括号内。
 
    14.二、next方法的参数
        next方法的参数为yield的执行结果,可向函数体内注入值。
        yield返回值一般为undefined;若是next带有参数,则返回该参数。next传递的参数每每为上一次yield的返回值。
 
    14.三、for…of循环
 
    14.四、Generator.prototype.throw(),可在函数体外抛出错误,函数体内执行。
 
    14.五、Generator.prototype.return()
        可返回给定的值,并终结Generator函数的遍历。
        g.return(“foo”) //{value: “foo”, done:true}
        若是函数内部有try...finally代码块,那么return方法会推迟到finally代码执行完再执行。
 
    14.六、yield语句
        若是Generator函数内部调用另外一个Generator函数,默认状况下无效;使用yield*,则生效。yield*表示在函数内部部署了一个for...of循环。
 
    14.七、做为对象属性的Generator函数
        let obj = {
            * myGeneratorMethod() {}
        }
 
    14.八、Generator函数的this
        构造函数返回的是一个内部的指针,可经过bind一个对象,赋予做用域,将this绑定在对象上。
 
    14.九、Generator函数推导
        let squard = (for (n of generator()) n * n);
 
    14.十、含义
        Generator与状态机,其自己包含状态机,不须要额外的外部变量保存状态。
 
    14.十一、应用
        a、异步操做的同步表达
            function* main() {
                var result = yield request(url);
                var resp = JSON.parse(result);
            }
 
            function request(url) {
                makeAjaxCall(url, function(response) {
                    it.next(response);
                });
            }
 
            var it = main();
            it.next();
        b、控制流管理
        c、部署iterator接口
                利用Generator函数能够在任意对象上部署Iterator接口。
        d、做为数据结构
            其能够返回一系列的值。
 
十5、promise对象
    15.一、promise的含义
        所谓promise就是一个对象,用来传递异步操做的消息。其有两个特色:
            a、其状态不受外界影响;其有三种状态:pending(进行中)、resolved (已完成,又称”fulfilled”)、rejected(已失败);
            b、一旦状态改变就不会再变,任什么时候候均可以获得这个结果;
        有了promise对象就能够将异步操做以同步操做的流程表达出来,避免了层层嵌套的回调。
        缺点:
            没法取消promis e;若是不设置回调,promise内部抛出的错误不会反应到外部;通常说来,若是事件不断发生,使用stream模式比部署promise更好。
 
    15.二、基本用法
            两个异步之间的调用:
                var p1 = new Promise(function (resolve, reject){})
                var p2 = new Promise(function (resolve, reject){
                    resolve(p1);
                })
            p2的状态为(p1 与 p2)的并集。只要一个为rejected,则为rejected;所有为resolved则为resolved。
 
    15.三、Promise.prototype.then()
        then方法返回一个promise实例(并不是前一个实例),此时能够链式的调用then。
 
    15.四、Promise.prototype.catch()
        其是.then(null, rejection)的别名,用于指定发生错误的回调函数;promise在resolve后再抛出错误,并不会被捕获。
        promise的错误具备“冒泡”性质,会一直向后传递,直到捕获为止。最好不在then的第二个参数定义rejected状态的回调,而应使用catch方法。
        catch方法也是返回一个promise实例。
 
    15.五、promise.all()
        promise.all方法用于将多个promise实例包装成一个新的promise实例。
        var p = Promise.all([p1, p2, p3]);其参数必须具备iterator接口,且返回的每一个成员都是Promise实例。
        p的状态为:
            a、三者都为resolved,则它为resolved;
            b、只要一个为rejected,则它为rejected;此时第一个被rejected的实例的返回值会传递给回调函数。
 
    15.六、promise.race()
        亦是将多个promise实例包装成一个新的promise实例。只要其中有一个实例改变状态,p的状态也跟着改变。
 
    15.七、promise.resolve()
        其可将现有对象转为promise对象;
        promise.resolve(‘foo’) 等价于 new Promise(resolve => resolve('foo’));
 
    15.八、promise.reject()
        返回一个promise的实例,状态为rejected。
 
    15.九、两个附加方法
        done():为了最终捕获任何可能出现的错误;
        finally():指定无论promise对象最后状态如何都会执行的操做。
 
    15.十、应用
        a、加载图片
        b、Generator与Promise(管理 流程+异步 混合操做)
 
    15.十一、async函数(亦是用于取代回调函数解决异步操做)
 
十6、异步操做和async函数
    在ES6诞生前,异步编程的方法大概有4种:
        a、回调函数;
        b、事件监听;
        c、发布、订阅;
        d、promise对象。
        
    16.一、Generator函数
        协程,相似线程,执行到一半转移执行权。yield命令将执行权交给其余协程。
        其数据交换及错误处理:next(x);try{}catch{}.
        fetch返回promise对象。
 
    16.二、thunk函数(结合generator函数进行自动流程管理)
        编译器的“传名调用”,将参数放到一个临时函数中,再将临时函数传入函数体内。这个临时函数就叫thunk函数。
 
    16.三、co模块
        co模块用于Generator函数的自动执行。
        var co = require(‘co’);
        co(gen);
        co(gen).then(function() {
            console.log(‘generator函数执行完毕');
        });
        如何交回generator的执行权:
            a、回调函数。将异步包装成thunk函数,在回调函数中交回执行权。
            b、promise对象。将异步操做包装成promise对象,用then 方法交回执行权。
        co模块是将两种自动执行器包装成了一个模块,使用co的前提条件是,yield命令后面只能是thunk函数活着promise对象。
 
    16.四、async函数(属于es7)
        async函数:
            a、内置执行器;
            b、更好的语义;
            c、更广的适应性,async函数的await命令后面可使promise对象和原始类型值;
            d、返回值为promise对象。
 
十7、Class
    17.一、基本语法
        定义类:
            class Point {
                constructor(x, y) {
                    this.x = x;
                    this.y = y;
                }
 
                toString() {
                    return ‘(‘ + this.x + ‘, ‘ + this.y + ‘)’;
                }
            }
    类的数据类型就是函数,类自己就指向构造函数。
    类的内部定义的全部方法都是不可枚举的。
    不存在变量提高。
 
    17.二、class的继承
        class之间经过extends关键字实现继承;经过super方法,指向父类的this对象。
        class ColorPoint extends Point {
            constructor(x, y, color) {
                super(x, y); //调用父类的constructor(x, y)
                this.color = color;            
            }
        }
    es5的继承实质上是先创造子类的实例对象this,而后再将父类的方法添加到this上(parent.apply(this));
    es6的继承实质上是先建立父类的实例对象this(调用super方法),而后再用子类的构造函数修改this。
    类的prototype属性和__proto__属性:
        a、子类的__proto__属性表示构造函数的继承,指向父类;
        b、子类的prototype的__proto__属性表示方法的继承,指向父类的prototype属性。
    extends的继承目标:
        只要具备prototype属性,就能被继承。
        object.getPrototypeOf()方法从子类上获取父类。
        super关键字表明父类的实例。
 
    17.三、原生构造函数的继承
        es5没法继承,es6能够。
 
    17.四、class的取值函数(getter)和存值函数(setter)
        与es5同样,在class内部可使用get和set关键字对某个属性设置存值函数和取值函数,拦截该属性的存取行为。
 
    17.五、class的generator方法
        class Foo {
            constructor(…args) {
                this.args = args;
            }
            *[Symbol.iterator]() {
                for (let arg of this.args) {
                    yield arg;
                }
            }
        }
    
        for (let x of new Foo(‘hello’, ‘world’)) {
            console.log(‘x');
        }
 
        // hello //world
 
    17.六、class的静态方法
        定义:在一个方法上加static关键字,就表示该方法不会被实例继承,而是直接经过类调用,成为“静态方法”。
        经过使用extends,可让实例继承。
 
    17.七、class的静态属性
        定义:指class自己的属性,而不是定义在实例对象(this)上的属性。
 
    17.八、new.target属性
        new是从构造函数生成实例的命令。该属性能够肯定构造函数是怎么调用的。
        function Person(name) {
            if (new.target === Person) {
                this.name = name;
            } else {
                throw new Error('必须使用new生成实例’);
            }
        }
        var person = new Person(‘hit') //正确
        var notAPerson = Person.call(person, ‘张三’); // 报错
 
    17.九、mixin模式的实现
        定义:将多个类的接口“混入”另外一个类:
        
十8、修饰器 (ES7 但babel支持)
    18.一、类的修饰器
        @testable
        class MyTestableClass {}
        其中的@testable为修饰器,修改了类的行为,增长了一个静态属性。
 
    18.二、方法的修饰
        class Person {
            @readonly
            name() {
                return `${this.first} ${this.last}`
            }
        }
        修饰器函数共接受3个参数,修饰的目标对象;修饰的属性名;属性的描述对象。
        function readonly(target, name, descriptor) {
            descriptor.writable = false;
            return descriptor;
        }
 
        Object.definePrototype(Person.prototype, ’name’, descriptor);
 
    18.三、为什么修饰器不能用于函数
        修饰器职能用于类及类的方法,由于其存在函数提高。
 
    18.四、core-decorators.js
        其是一个第三方模块,提供了几个常见的修饰器。
        a、@autobind 使得方法中的this对象绑定原始对象。
        b、@readonly使得属性或者方法不可写;
        c、@override检查子类方法是否正确覆盖父类的同名方法;
        d、@deprecate在控制台显示一条警告,表示该方法将废除;
        e、@suppressWarnings 修饰器抑制decorated修饰器致使的console.warn调用。
 
    18.五、使用修饰器实现自动发布事件
        “发布/订阅”库postal.js
 
    18.六、mixin
        在修饰器的基础上能够实现mixin模式,就是对象继承的一种替代方案,在对象中混入另外一个对象的方法。
 
    18.七、trait
        效果与mixin相似,但提供更多的功能,好比防止同名方法的冲突、排除混入某些方法、为混入的方法起别名等。第三方模块:traits-decorator。
 
十9、module
    ES6的class只是面向对象编程的语法汤,升级了ES5构造函数的原型链继承的写法,并无解决模块化问题。
    commonjs模块是对象,输入时必须查找对象属性,其实质是总体加载模块,而后使用方法,这种为“运行时加载”。
    es6模块不是对象,而是经过export命令显示的制定输出的代码,输入时采用静态命令的形式。
    import{ start, exists, readFile} from ‘fs’;
    以上实质是从fs模块加载3个方法,其余方法不加载。这种加载称为“编译时加载”
    效率比commonjs高。
    ES6模块化的其余优势:
        a、再也不须要UMD模块格式;
        b、未来浏览器的新API能够用模块格式提供,再也不须要作成全局变量或者navigator对象的属性;
        c、再也不须要对象做为命名空间,将来这些功能可经过模块实现。
    19.一、严格模式 [lottery插件完成后作详细了解]
        模块化自动采用严格模式,限制以下:
            a、变量必须声明后使用;
            b、函数的参数不能有同名属性,不然报错;
            c、不能使用with语句;
            d、不能对只读属性赋值,负责报错;
            e、不能使用前缀0表示八进制,不然报错;
            f、不能删除不可删除的属性,不然报错;
            g、不能删除变量(delete prop),会报错,职能删除属性(delete global[prop]);
            h、eval不会再外层做用域引入变量;
            i、eval和arguments不能被从新赋值;
            j、arguments不会自动反映函数参数的变化;
            k、不能使用arguments.callee;
            l、不能使用arguments.caller;
            m、禁止this指向全局变量;
            n、不能使用fn.caller和fn.arguments获取函数调用的堆栈;
            o、增长保留字段(protected、static和interface)。
 
    19.二、export命令
        模块功能主要由两个命令构成:export和import;export用于规定模块的对外接口;import命令用于输入其余模块提供的功能。
        // profile.js
        export { f1 as firstName, lastName, year};
 
    19.三、import命令
        import {firstName as f1, lastName, year} from ‘./profile’;
 
    19.四、模块的总体加载
        除了指定加载某个输出值,还可使用总体加载,即用(*)指定一个对象,全部输出值都加载在这个对象上。
        import * as circle from ‘./circle’。
 
    19.五、module命令
        module可取代import命令,达到总体输入模块的做用。
        module circle from ‘./circle’。
 
    19.六、export default命令
        export default function() {};
        import cc32 from ‘crc32’;
    vs
        export function cc32() {};
        import {crc32} from ‘crc32’;
        留意大括号的区别(“{}”)。
 
    19.七、模块的继承
        export * from ‘circle’
        表示输出circle模块的全部属性和方法。
 
    19.八、ES6模块加载的实质
        ES6模块加载机制与commonjs模块彻底不一样。commons模块输出的是一个值的拷贝,而ES6模块输出的是值的引用。
 
    19.九、循环加载
        commonjs模块的加载原理:加载时执行,即代码在require 时就会所有执行;一旦出现“循环加载”,就只输出已经执行的部分,还未执行的部分不输出。
        ES6模块是动态引用,遇到模块加载命令import时不会去执行模块,只是生成饮用,开发者本身保证取值时可以真正取到值。
 
    19.十、ES6模块的转码
        除babel能够转外,一下两种方法也能够:
        a、ES6 module transpiler
        b、systemJS 
 
二10、编程风格[可参阅jscs.info]
    20.一、块级做用域
        let 取代 var;
        全局常量和线程安全:建议使用const而非let;
 
    20.二、字符串
        一概使用单引号或者反引号;const b = `foo${a}bar`;
 
    20.三、解构赋值
        数组成员对变量赋值,优先解构赋值。
 
    20.四、对象
        a、单行定义的对象,最后一个成员不以逗号结尾。多行定义的对象须要。
        b、对象尽可能静态化,一旦定义,就不得随意添加新的属性。
            const a = {x: null};
            a.x = 3;
        c、若是对象属性名是动态的,在建立时,使用属性表达式定义。
            const obj = {
                id: 5,
                [getKey(‘enabled’)]: true
            }
        d、对象的属性和方法尽可能采用简洁表达法,易于描述和书写:
            const atom = {
                ref, //ref: ref
                addValue(value) {
                    return atom.value + value;
                }
            }
 
    20.五、数组
        使用扩展运算符(...)复制数组。
        const itemsCopy = […list];
 
    20.六、函数
        a、当即执行函数使用箭头函数
            (() => {
                console.log(‘Welecome to the Internet.');
            })();
        b、使用函数表达式的场合,使用箭头函数
            [1, 2, 3].map([x] => {
                return x*x;
            })
        c、箭头函数代替Function.prototype.bind,不该再用self/_this/that绑定this.
            const boundMethod = (…params) => method.apply(this, params);
        d、简单的、单行的、不会复用的函数,建议采用箭头函数。
        e、全部配置项都应该集中在一个对象,放在最后一个参数,布尔值不能够直接做为参数:
            function divide(a, b, {option = false} = {})
        f、再也不函数体内使用arguments变量,使用(…)代替:
            function all(…args) {
                return args.join('');
            }
        g、默认值语法设置函数参数的默认值:
            function handle(opts = {}){}
 
    20.七、map结构
        注意区分object和map,若是只是须要key:value的数据结构,则使用map。
 
    20.八、class    
        a、用class取代须要prototype的操做。
        b、使用extends实现继承
 
    20.九、模块
        a、module语法是javascript模块的标准写法,使用import取代require;
        b、使用export取代module.exports;
        c、export default不要与普通export同时使用;
        d、不要再模块输入中使用通配符*;
 
    20.十、eslint的使用

        其是一个语法规则和代码风格检查工具,能够确保语法正确、风格统一。 javascript

摘自:http://www.cnblogs.com/hity-tt/p/6511019.htmlhtml

相关文章
相关标签/搜索
本站公众号
   欢迎关注本站公众号,获取更多信息