打算分为:简介和高阶用法
/* auth: Allan_Liu
date: 2019-2-24
mail: allan_liu986@163.com
info:
Generator函数的简介:
1. *代表是生成器函数(Generator)
2. yield关键字是ES6的新特性,通过它来指定调用next()方法时的 返回值 及 返回顺序(比如Example1)
3. yield可以返回任何值或者表达式。(比如可以在循环中使用yield, 比如Example2)
4. 特性:每当执行完一条yield语句时,会自动停止执行。示例中直到遇到下次调用next()方法。
5. 可以通过函数表达式创建生成器,只需要在function和小括号中间添加 *(比如:let a = function *(){...} )
6. 也可以用ES6函数的简写方式来创建生成器函数, *createrGenerator() {...} ,功能上并无差别。
waring:
1. yeild不可在生成器的嵌套函数中使用,与return一样不能穿越function的边界(比如Example3)
2. 不能用箭头函数来创建生成器
*/
//Example1
var color = 'green'
function *createrGenerator() {
yield 1.1;
yield 'abc';
yield color;
}
let generator = createrGenerator();
console.log(generator.next().value) //1.1
console.log(generator.next().value) //'abc'
console.log(generator.next().value) //'green'
//Example2
function *generatorFunc(values) {
for(let items of values) {
yield items +1; //yield可以进行加减操作
}
}
let generatorFunc1 = generatorFunc([1,2,3])
console.log(generatorFunc1.next().value);//2
console.log(generatorFunc1.next().value);//3
console.log(generatorFunc1.next().value);//4
//Example3
function *generator(items) {
items.forEach(function(item){
yield item + 1; //Uncaught SyntaxError: Unexpected identifier
});
}
let generator1= generator([1,2,3])
console.log(generator1.next())
2.forEarch 和 for…in 和 for…of 的区别?
/*
auth: Allan_Liu
date: 2019-2-25
mail: allan_liu986@163.com
question:forEarch 和 for..in 和 for..of 的区别?
answer:
1. for..in是ES5提出,遍历数组中的索引(一般用来遍历对象)。
还会遍历自定义添加的属性(如Example1中还可以遍历obj1原型上的对象)
可用break和return语句
2. for..of是ES6提出,遍历数组中的元素(区别于以前的for循环以遍历索引为主)。原理是通过ES6的iterator(迭代器)实现的。
可用break和return语句
3. forEarch不能使用break跳出循环,或者return从函数题返回(如Example2)。
*/
//Example1
var object = {a: 1, b: 2};
function createrFunc1() {
this.color = 3;
this.color1 = 'red';
}
createrFunc1.prototype = object;
var obj1 = new createrFunc1()
for(var i in obj1) {
console.log(`obj1.${i} = ${obj1[i]}`); //
}
//Example2
var arr = [1,2,3]
for(let i of arr) {
if(i > 2) { //i为每一个元素
break;
}
console.log(i, '--for--of--')// 1 和 2
}
arr.forEach(item => {
if(item > 2) {
break; //Uncaught SyntaxError: Illegal break statement (非法的break语句)
}
})
for(let i in arr) {
if(i > 1) { //i为索引
break;
}
console.log(i, '--in--')
}