!!本文着重主要是对ES6语法常用知识点的说明,不会讲解一些API层面的语法
ES5只有两种声明变量的方法: var和function
①
②
③
④
⑤
①
②
③
④
①
①
②
rest 参数搭配的变量是一个数组,该变量将多余的参数放入数组中(rest 参数之后不能再有其他参数:
③
箭头函数没有arguments;
箭头函数没有prototype属性,没有constructor,即不能用作与构造函数(不能用new关键字调用);
箭头函数没有自己this,它的this是词法的,引用的是上下文的this;
箭头函数不能用作Generator函数
①
②
③
var o = {
method() {
return "Hello!";
}
};
// 等同于
var o = {
method: function() {
return "Hello!";
}
};
④
①
②
①
Map可以接受一个数组作为参数。数组的成员是一个个表示键值对的数组
var map = new Map([
['name', '张三'],
['title', 'Author']
]);
=====>实际上执行的是下面的算法:
var items = [
['name', '张三'],
['title', 'Author']
];
var map = new Map();
items.forEach(([key, value]) => map.set(key, value));
②
var map = new Map();
map.set(['a'], 555);
map.get(['a']) // undefined
=========》
var map = new Map();
var k1 = ['a'];
var k2 = ['a'];
map
.set(k1, 111)
.set(k2, 222);
map.get(k1) // 111
map.get(k2) // 222
①
var promise = new Promise(function(resolve, reject) {
// ... some code
if (/* 异步操作成功 */){
resolve(value); //在异步操作成功时回调,并将异步操作的结果,作为参数传递出去
} else {
reject(error);//在异步操作失败时回调,并将异步操作报出的错误,作为参数传递出去
}
});
用then方法分别指定 Resolved 状态和 Reject 状态的两个回调函数:
================================================================>>>
方法1
promise.then(function(value) {
// success
}, function(error) {
// failure
});
方法2(推荐)
promise.then(function(value) {
// success
})
.catch( function(error) {
// failure
});
如果要将现有对象转为Promise对象
Promise.resolve('foo')
// 等价于
new Promise(resolve => resolve('foo'))
===================================================>>
Promise.reject('出错了');
// 等同于
new Promise((resolve, reject) => reject('出错了'))
①
默认具有iterator接口的数据结构有:Array,Map,Set,String,TypedArray(类数组),函数的 arguments 对象,NodeList 对象…
例:
变量 arr 是一个数组,原生就具有遍历器接口(部署在 arr的[Symbol.iterator] 属性上面)所以,调用这个属性并执行,就会返回一个iter的遍历器对象
③
例:for…of 循环本质上就是调用这个接口产生的遍历器对象
①
上例生成器函数执行返回一个遍历器对象a,有三个状态:Liu,Jian和Feng;
遍历器对象的 next 方法的运行逻辑:
1.遇到 yield 语句,就暂停执行后面的操作,并将紧跟在 yield 后面的那个表达式的值,作为返回的对象的 value 属性值。
2.下一次调用 next 方法时,再继续往下执行,直到遇到下一个 yield 语句。
3.如果没有再遇到新的 yield 语句,就一直运行到函数结束,直到 return 语句为止,并将 return 语句后面的表达式的值,作为返回的对象的 value 属性值。
4.如果该函数没有 return 语句,则返回的对象的 value 属性值为 undefined 。
②
yield 句本身没有返回值,或者说总是返回 undefined 。 next 方法可以带一个参数,该参数就会被当作上一个 yield 语句的返回值
1.定义了一个可以无限运行的 Generator 函数 f ,如果 next 方法没有参数,每次运行到 yield 语句,变量 reset 的值总是 undefined
2.当 next 方法带一个参数 true 时,变量 reset 就被重置为这个参数(即 true ),因此 i 会等于 -1 ,下一轮循环就会从 -1 开始递增。
1.第一次调用 b 的 next 方法时,返回 x+1 的值6;
2.第二次调用 next 方法,将上一次 yield 语句的值设为12,因此 y 等于24,返回 y / 3 的值8
3.第三次调用 next 方法,将上一次 yield 语句的值设为13,因此 z 等于13,这时 x 等于5, y 等于24,所以 return 语句的值等于42
注:由于 next 方法的参数表示上一个 yield 语句的返回值,所以第一次使用 next 方法时,不能带有参数
③
*** yield* 语句在 Generator 函数内部,调用另一个 Generator 函数 ***
function *caoncat(iter1,iter2){
yield *iter1();
yield *iter2();
}
等价于
============>
function *caoncat(iter1,iter2){
for(var value of iter1()){
yield value;
}
for(var value of iter2()){
yield value;
}
}
①
async function f() {
await Promise.reject('出错了');
await Promise.resolve('hello world'); // 不会执行
}
解决办法:把 await 命令放在 try…catch 代码块中
async function f() {
try {
await Promise.reject('出错了');
} catch(e) {
}
return await Promise.resolve('hello world');
}
f()
.then(v => console.log(v))
// hello world
②
// 写法一(推荐)
let [foo, bar] = await Promise.all([getFoo(), getBar()]);
// 写法二
let fooPromise = getFoo();
let barPromise = getBar();
let foo = await fooPromise;
let bar = await barPromise;
***优秀的例子***
async function dbFuc(db) {
let docs = [{}, {}, {}];
let promises = docs.map((doc) => db.post(doc)); // 发送post请求
let results = [];
for (let promise of promises) {
results.push(await promise);
}
console.log(results);
}
参考实现继承的多种方式
参考模块规范之ES6,CommonJS,AMD,CMD