es6

136 阅读4分钟
//      let 定义变量
//      没有变量提升             不可以重复定义  
//      临时失效区              块级作用域

//     const 代表一个值的 常量索引
//     换句话说,变量的名字在内存中的指针不能够改变
//     但是指向这个变量的值 可能 改变。


// 解构赋值语法是一个 Javascript 表达式,这使得可以将值从数组或属性从对象提取到不同的变量中。
// 箭头函数
// 1.函数体内this对象就是定义时所在的对象,而不是使用时所在的对象
// 2.不可以当做构造函数,不可以使用new命令,否则会抛出一个错误
// 3.不可以使用arguments对象,该对象在函数体内不存在,如果要用,可以使用rest

// set:
// set类似于数组,但是成员的值都是唯一的,没有重复的值

// map:
// map类似于对象,也是键值对的集合,但是键的范围不限于字符串,各种类型的值都可以当做键值

// class
// 类,对象
// constructor(),
// 类和模块的内部默认就是严格模式
// extends()

// promise:
// Promise 是一个对象
// Promise的构造函数接收一个参数,是函数,并且传入两个参数:resolve,reject,分别表示异步操作执行成功后的回调函数和异步操作执行失败后的回调函数。
// 从它可以获取异步操作的消息。Promise 提供统一的 API,
// 各种异步操作都可以用同样的方法进行处理。
// Promise实例生成以后,可以用then方法
// 分别制定Resolved状态和Rejected状态的回调函数:
// catch是用于指定发生错误时的回调函数。
// (建议不要在then的第二个参数写rejected状态,
// 总是使用catch)

// 不管是then或者catch返回的都是一个新的Promise实例!
// 而每个Primise实例都有最原始的Pending(进行中)到Resolve(已完成),
// 或者Pending(进行中)到Reject(已失败)的过程

// Symbol:
// ES6引入了一种新的原始数据类型Symbol,表示独一无二的值。
// 重新复习下新知识:基本数据类型有6种:Undefined、Null、布尔值(Boolean)、字符串(String)、数值(Number)、对象(Object)
// 这里新添加了一种:Symbol
// 注意,Symbol函数前不能使用new命令,否则会报错。这是因为生成的Symbol是一个原始类型的值,不是对象
// Symbol函数可以接受一个字符串作为参数,表示对Symbol实例的描述,主要是为了在控制台显示,或者转为字符串时,比较容易区分。
// Symbol值不能与其他类型的值进行运算
// Symbol值作为对象属性名时,不能用点运算符
// Symbol值作为属性名时,该属性还是公开属性,不是私有属性。
// 这个有点类似于java中的protected属性(protected和private的区别:在类的外部都是不可以访问的,在类内的子类可以继承protected不可以继承private)
// 但是这里的Symbol在类外部也是可以访问的,只是不会出现在for...in、for...of循环中,
// 也不会被Object.keys()、Object.getOwnPropertyNames()返回。但有一个Object.getOwnPropertySymbols方法,可以获取指定对象的所有Symbol属性名

// generator:
// generator(生成器)是ES6标准引入的新的数据类型。一个generator看上去像一个函数,但可以返回多次。
// 函数在执行过程中,如果没有遇到return语句(函数末尾如果没有return,就是隐含的return undefined;),控制权无法交回被调用的代码。

// generator跟函数很像,定义如下:

function* foo(x) {
    yield x + 1;
    yield x + 2;
    return x + 3;
}
// generator和函数不同的是,generator由function*定义(注意多出的*号),并且,除了return语句,还可以用yield返回多次

// 要编写一个产生斐波那契数列的函数,可以这么写:
function fib(max) {
    var
        t,
        a = 0,
        b = 1,
        arr = [0, 1];
    while (arr.length < max) {
        [a, b] = [b, a + b];
        arr.push(b);
    }
    return arr;
}

// 测试:
fib(5); // [0, 1, 1, 2, 3]
fib(10); // [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
// 函数只能返回一次,所以必须返回一个Array。但是,如果换成generator,就可以一次返回一个数,不断返回多次。用generator改写如下:
function* fib(max) {
    var
        t,
        a = 0,
        b = 1,
        n = 0;
    while (n < max) {
        yield a;
        [a, b] = [b, a + b];
        n ++;
    }
    return;
}
for (var x of fib(10)) {
    console.log(x); // 依次输出0, 1, 1, 2, 3, ...
}
// generator还有另一个巨大的好处,就是把异步回调代码变成“同步”代码
try {
    r1 = yield ajax('http://url-1', data1);
    r2 = yield ajax('http://url-2', data2);
    r3 = yield ajax('http://url-3', data3);
    success(r3);
}
catch (err) {
    handle(err);
}
// 看上去是同步的代码,实际执行是异步的