ES6学习笔记14 Generator 函数

42、Windows Server Update Services(WSUS)全面指南 本文全面介绍了Windows Server Update Services(WSUS)的安装、配置、管理与优化策略。内容涵盖WSUS基础认知、客户端更新问题解决、多服务器架构设计、计算机分组策略、更新审批与报告查看,并深入探讨了SSL加密配置、性能优化、与其他系统(如AD和SCCM)集成以及常见故障排查方法。通过本指南,IT管理员可高效部署和管理企业级软件更新,提升安全性和运维效率。 阅读详情

简介

Generator 函数有多种理解角度。语法上,首先可以把它理解成,Generator 函数是一个状态机,封装了多个内部状态。

执行 Generator 函数会返回一个遍历器对象,也就是说,Generator 函数除了状态机,还是一个遍历器对象生成函数。返回的遍历器对象,可以依次遍历 Generator 函数内部的每一个状态。

形式上,Generator 函数是一个普通函数,但是有两个特征。一是,function关键字与函数名之间有一个星号;二是,函数体内部使用yield表达式,定义不同的内部状态。

function* helloWorldGenerator() {
  yield 'hello';
  yield 'world';
  return 'ending';
}

var hw = helloWorldGenerator();

调用 Generator 函数后,该函数并不执行,返回的也不是函数运行结果,而是一个指向内部状态的指针对象,也就是遍历器对象

下一步,必须调用遍历器对象的next方法,使得指针移向下一个状态。每次调用next方法,内部指针就从函数头部或上一次停下来的地方开始执行,直到遇到下一个yield表达式(或return语句)为止,如果没有再遇到新的yield表达式,就一直运行到函数结束。换言之,Generator 函数是分段执行的,yield表达式是暂停执行的标记,而next方法可以恢复执行。

hw.next()
// { value: 'hello', done: false }

hw.next()
// { value: 'world', done: false }

hw.next()
// { value: 'ending', done: true }

hw.next()
// { value: undefined, done: true }

yield表达式

yield表达式后面的表达式,只有当调用next方法、内部指针指向该语句时才会执行,因此等于为 JavaScript 提供了手动的“惰性求值”(Lazy Evaluation)的语法功能。

function* gen() {
  yield  123 + 456;  //后面的表达式只有当调用next方法时,才会计算求值
}

yield表达式只能用在 Generator 函数里面,用在其他地方都会报错。另外,yield表达式如果用在另一个表达式之中,必须放在圆括号里面

function* demo() {
  console.log('Hello' + yield); // SyntaxError
  console.log('Hello' + yield 123); // SyntaxError

  console.log('Hello' + (yield)); // OK
  console.log('Hello' + (yield 123)); // OK
}

yield表达式用作函数参数或放在赋值表达式的右边,可以不加括号

function* demo() {
  foo(yield 'a', yield 'b'); // OK
  let input = yield; // OK
}

与Iterator接口的关系

由于 Generator 函数就是遍历器生成函数,因此可以把 Generator 赋值给对象的Symbol.iterator属性,从而使得该对象具有 Iterator 接口。

var myIterable = {};
myIterable[Symbol.iterator] = function* () {
  yield 1;
  yield 2;
  yield 3;
};

[...myIterable] // [1, 2, 3]

Generator 函数执行后,返回一个遍历器对象。该对象本身也具有Symbol.iterator属性,执行后返回自身。

function* gen(){
  // some code
}

var g = gen();

g[Symbol.iterator]() === g
// true

next方法的参数

yield表达式本身没有返回值,或者说总是返回undefined。next方法可以带一个参数,该参数就会被当作上一个yield表达式的返回值。

function* f() {
  for(var i = 0; true; i++) {
    var reset = yield i;     //reset为yield表达式的返回值
    if(reset) { i = -1; }    //当reset不为undefined时,i赋值为-1
  }
}

var g = f();

g.next() // { value: 0, done: false }
g.next() // { value: 1, done: false }
g.next(true) // { value: 0, done: false }

这个功能有很重要的语法意义。Generator 函数从暂停状态到恢复运行,它的上下文状态(context)是不变的。通过next方法的参数,就有办法在 Generator 函数开始运行之后,继续向函数体内部注入值。

注意,由于next方法的参数表示上一个yield表达式的返回值,所以在第一次使用next方法时,传递参数是无效的。要想在第一次调用时就能输入值,可以在 Generator 函数外面再包一层。

function wrapper(generatorFunction) {
  return function (...args) {
    let generatorObject = generatorFunction(...args);  //调用原始的Generator函数
    generatorObject.next();   //先执行一次next方法
    return generatorObject;   //返回遍历器对象
  };
}

const wrapped = wrapper(function* () {
  console.log(`First input: ${yield}`);
  return 'DONE';
});

wrapped().next('hello!')
// First input: hello!

上述代码在wrapper函数中,首先调用一次next方法,再返回遍历器对象。当用户自己调用next方法时,看起来就像是第一次调用,但实际上,这是第二次调用next方法。

for…of 循环

for...of循环可以自动遍历 Generator 函数时生成的Iterator对象,且此时不再需要调用next方法,但是遍历不包含return语句的返回值

function* foo() {
  yield 1;
  yield 2;
  yield 3;
  yield 4;
  yield 5;
  return 6;
}

for (let v of foo()) {
  console.log(v);
}
// 1 2 3 4 5

除了for...of循环以外,扩展运算符(...)、解构赋值和Array.from方法内部调用的,都是遍历器接口。这意味着,它们都可以将 Generator 函数返回的 Iterator 对象,作为参数。

function* numbers () {
  yield 1
  yield 2
  return 3
  yield 4
}

// 扩展运算符
[...numbers()] // [1, 2]

// Array.from 方法
Array.from(numbers()) // [1, 2]

// 解构赋值
let [x, y] = numbers();
x // 1
y // 2

// for...of 循环
for (let n of numbers()) {
  console.log(n)
}
// 1
// 2

Generator.prototype.throw() 和 Generator.prototype.return()

Generator 函数返回的遍历器对象,都有一个throw方法,可以在函数体外抛出错误,然后在 Generator 函数体内捕获。throw方法可以接受一个参数,建议抛出Error对象的实例。

var g = function* () {
  try {
    yield;
  } catch (e) {
    console.log('内部捕获', e);
  }
};

var i = g();
i.next();

try {
  i.throw('a');
  i.throw('b');
} catch (e) {
  console.log('外部捕获', e);
}
// 内部捕获 a
// 外部捕获 b

遍历器对象的throw方法与全局的throw命令相比,前者抛出的错误可以被Generator函数内部的catch语句(优先捕获)和函数外部的catch语句捕获,后者抛出的错误只能被函数体外的catch语句捕获

var g = function* () {
  while (true) {
    yield;
    console.log('内部捕获', e);
  }
};

var i = g();
i.next();

try {
  i.throw('a');
  i.throw('b');
} catch (e) {
  console.log('外部捕获', e);
}
// 外部捕获 a

如果 Generator 函数内部和外部,都没有部署try...catch代码块,那么throw方法将导致程序报错,直接中断执行。

throw方法被捕获以后,会附带执行下一条yield表达式。也就是说,会附带执行一次next方法。

var gen = function* gen(){
  try {
    yield console.log('a');
  } catch (e) {
    // ...
  }
  yield console.log('b');
  yield console.log('c');
}

var g = gen();
g.next() // a
g.throw() // b
g.next() // c

Generator 函数体外抛出的错误,可以在函数体内捕获;反过来,Generator 函数体内抛出的错误,也可以被函数体外的catch捕获。一旦 Generator 执行过程中抛出错误,且没有被内部捕获,就不会再执行下去了。如果此后还调用next方法,将返回一个value属性等于undefined、done属性等于true的对象,即 JavaScript 引擎认为这个 Generator 已经运行结束了。

function* foo() {
  var x = yield 3;
  var y = x.toUpperCase();  //报错
  yield y;
}

var it = foo();

it.next(); // { value:3, done:false }

try {
  it.next(42);
} catch (err) {
  console.log(err);   //捕获
}

Generator函数返回的遍历器对象,还有一个return方法,可以返回给定的值,并且终结遍历 Generator 函数。如果不提供参数,则返回undefined

function* gen() {
  yield 1;
  yield 2;
  yield 3;
}

var g = gen();

g.next()        // { value: 1, done: false }
g.return('foo') // { value: "foo", done: true }
g.next()        // { value: undefined, done: true }

如果Generator函数内部有try...finally代码块,那么return方法会推迟到finally代码块执行完再执行。

function* numbers () {
  yield 1;
  try {
    yield 2;
    yield 3;
  } finally {
    yield 4;
    yield 5;
  }
  yield 6;
}
var g = numbers();
g.next() // { value: 1, done: false }
g.next() // { value: 2, done: false }
g.return(7) // { value: 4, done: false }
g.next() // { value: 5, done: false }
g.next() // { value: 7, done: true }

比较遍历器对象的next()、throw()和return()方法,它们的作用都是让Generator函数恢复执行,并且使用不同的语句替换yield表达式。next()是将yield表达式替换成一个值,throw()是将yield表达式替换成一个throw语句,而return()是将yield表达式替换成一个return语句。

yield* 表达式

如果在 Generator 函数内部,调用另一个 Generator 函数,默认情况下是没有效果的。而yield*表达式,用来在一个 Generator 函数里面执行另一个 Generator 函数。yield*后面跟的是一个遍历器对象

function* bar() {
  yield 'x';
  yield* foo();
  yield 'y';
}

// 等同于
function* bar() {
  yield 'x';
  yield 'a';
  yield 'b';
  yield 'y';
}

// 等同于
function* bar() {
  yield 'x';
  for (let v of foo()) {
    yield v;
  }
  yield 'y';
}

for (let v of bar()){
  console.log(v);
}
// "x"
// "a"
// "b"
// "y"

如果yield*后面跟着数据结构,只要该数据结构具有Iterator接口,就可以被yield*遍历

function* gen(){
  yield* ["a", "b", "c"];
}

gen().next() // { value:"a", done:false }
let read = (function* () {
  yield 'hello';
  yield* 'hello';
})();

read.next().value // "hello"
read.next().value // "h"

如果被代理的 Generator 函数有return语句,那么就可以向代理它的 Generator 函数返回数据。

function* genFuncWithReturn() {
  yield 'a';
  yield 'b';
  return 'The result';
}
function* logReturned(genObj) {
  let result = yield* genObj;
  console.log(result);
}

[...logReturned(genFuncWithReturn())]
// The result
// 值为 [ 'a', 'b' ]

上面代码中,存在两次遍历。第一次是扩展运算符遍历函数logReturned返回的遍历器对象,第二次是yield*语句遍历函数genFuncWithReturn返回的遍历器对象。genFuncWithReturn的return语句的返回值The result,会返回给函数logReturned内部的result变量,因此会有终端输出

使用yield*语句完全遍历二叉树

// 下面是二叉树的构造函数,
// 三个参数分别是左树、当前节点和右树
function Tree(left, label, right) {
  this.left = left;
  this.label = label;
  this.right = right;
}

// 下面是中序(inorder)遍历函数。
// 由于返回的是一个遍历器,所以要用generator函数。
// 函数体内采用递归算法,所以左树和右树要用yield*遍历
function* inorder(t) {
  if (t) {
    yield* inorder(t.left);
    yield t.label;
    yield* inorder(t.right);
  }
}

// 下面递归生成二叉树
function make(array) {
  // 判断是否为叶节点
  if (array.length == 1) return new Tree(null, array[0], null);
  return new Tree(make(array[0]), array[1], make(array[2])); 
}
let tree = make([[['a'], 'b', ['c']], 'd', [['e'], 'f', ['g']]]);

// 遍历二叉树
var result = [];
for (let node of inorder(tree)) {
  result.push(node);
}

result
// ['a', 'b', 'c', 'd', 'e', 'f', 'g']

作为对象属性的 Generator 函数

如果一个对象的属性是 Generator 函数,可以简写成下面的形式

let obj = {
  * myGeneratorMethod() {
    ···
  }
};

Generator 函数的 this

Generator函数总是返回一个遍历器,ES6规定这个遍历器是Generator函数的实例,也继承了 Generator 函数的prototype对象上的方法。

如果把Generator当作普通的构造函数,并不会生效,因为其返回的总是遍历器对象,而不是this对象。Generator 函数也不能跟new命令一起用,会报错

function* g() {
  this.a = 11;
}

let obj = g();
obj.next();
obj.a // undefined

将this对象绑定至Generator 函数的prototype对象上的方法,可以使返回的遍历器对象继承属性

function* F() {
  this.a = 1;
  yield this.b = 2;
  yield this.c = 3;
}

var f = F.call(F.prototype);

f.next();  // Object {value: 2, done: false}
f.next();  // Object {value: 3, done: false}
f.next();  // Object {value: undefined, done: true}

f.a // 1
f.b // 2
f.c // 3

在外面包一层普通函数,即可使用new命令

function* F() {
  this.a = 1;
  yield this.b = 2;
  yield this.c = 3;
}

function F_constructor(){
    return F.call(F.prototype)
}

f = new F_constructor();

f.next();  // Object {value: 2, done: false}
f.next();  // Object {value: 3, done: false}
f.next();  // Object {value: undefined, done: true}

f.a // 1
f.b // 2
f.c // 3

Generator 与上下文

JavaScript 代码运行时,会产生一个全局的上下文环境(context,又称运行环境),包含了当前所有的变量和对象。然后,执行函数(或块级代码)的时候,又会在当前上下文环境的上层,产生一个函数运行的上下文,变成当前(active)的上下文,由此形成一个上下文环境的堆栈(context stack)。

这个堆栈是“后进先出”的数据结构,最后产生的上下文环境首先执行完成,退出堆栈,然后再执行完成它下层的上下文,直至所有代码执行完成,堆栈清空。

Generator 函数不是这样,它执行产生的上下文环境,一旦遇到yield命令,就会暂时退出堆栈,但是并不消失,里面的所有变量和对象会冻结在当前状态。等到对它执行next命令时,这个上下文环境又会重新加入调用栈,冻结的变量和对象恢复执行。

应用

(1)异步操作的同步化表示
Generator 函数的暂停执行的效果,意味着可以把异步操作写在yield表达式里面,等到调用next方法时再往后执行。这实际上等同于不需要写回调函数了,因为异步操作的后续操作可以放在yield表达式下面,反正要等到调用next方法时再执行。所以,Generator函数的一个重要实际意义就是用来处理异步操作,改写回调函数。
下面是通过 Generator 函数部署 Ajax 操作

function* main() {
  var result = yield request("http://some.url");  //等待返回response
  var resp = JSON.parse(result);
    console.log(resp.value);
}

function request(url) {
  makeAjaxCall(url, function(response){
    it.next(response);   //通过next方法传递response
  });
}

var it = main();
it.next();

(2)控制流管理
利用for...of循环会自动依次执行yield命令的特性,提供一种更一般的控制流管理的方法。

let steps = [step1Func, step2Func, step3Func];

function* iterateSteps(steps){
  for (var i=0; i< steps.length; i++){
    var step = steps[i];
    yield step();
  }
}

将任务分解成步骤之后,还可以使用yield*将项目分解成多个依次执行的任务

let jobs = [job1, job2, job3];

function* iterateJobs(jobs){
  for (var i=0; i< jobs.length; i++){
    var job = jobs[i];
    yield* iterateSteps(job.steps);
  }
}

最后,就可以用for...of循环一次性依次执行所有任务的所有步骤

for (var step of iterateJobs(jobs)){
  console.log(step.id);
}

(3)部署Iterator接口
利用 Generator 函数,可以在任意对象上部署 Iterator 接口。

(4)作为数据结构
Generator 可以看作是数据结构,更确切地说,可以看作是一个数组结构,因为 Generator 函数可以返回一系列的值,这意味着它可以对任意表达式,提供类似数组的接口。

function* doStuff() {
  yield fs.readFile.bind(null, 'hello.txt');
  yield fs.readFile.bind(null, 'world.txt');
  yield fs.readFile.bind(null, 'and-such.txt');
}

for (task of doStuff()) {
  // task是一个函数,可以像回调函数那样使用它
}
华为OD机考双机位C卷 - 简单的解压缩算法 (Java & Python & JS & GO & C++ & C) 华为OD机考双机位C卷 - 简单的解压缩算法 , 提供Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。 阅读详情

相关推荐

STP生成树/BPDU保护小实验

HCIA部分—STP生成树小实验 实验环境如图所示,要求: 1.在SW1上配置为根桥,使SW3的G0/0/1口作为根端口 2.在SW1的G0/0/3配置为边缘端口 3.若在SW1的G0/0/3口收到BPDU,能自动关闭该端口 4.通过配置bpdu保护,使端口能自动恢复up状态 首先,我们可以通过命令dis stp brief或者dis stp命令来得知SW1在生成树中的角色 确认SW1为非根交换机,此时可以通过修改stp优先级来让SW1成为根桥: 优先级数值缺省为32768,数值越小,优先级越高,数值

1mih的博客 5148

Deep Q-Network 学习笔记(二)—— Q-Learning与神经网络结合使用(有代码实现)...

参考资料: https://morvanzhou.github.io/ 非常感谢莫烦老师的教程 http://mnemstudio.org/path-finding-q-learning-tutorial.htm http://www.cnblogs.com/dragonir/p/6224313.html 这篇文章也是用非常简单的说明将Q-Learning 的过程给讲解清楚了 ...

weixin_34186128的博客 2198

让数学变得更生动manim库的使用(1)-基本概念

0、概述 数学理论与数学公式的展示总是一件很枯燥的事情,但3b1b的manim动画库在github上开源之后,让这一切变得非常简单。目前这个库已经分成两个版本一个由3b1b自身维护。但作者并没有承诺长期维护该库,所以由专门团队再次基础上研发了相应的社区版,并对该版本进行长期维护。本文的所有案例都基于社区版的官方案例。本文主要介绍该库的基本概念相关的案例,文章主要以代码为主,关键代码都有相关注释。 另外本文的运行环境维jupyter这与其他的ide环境运行代码稍微有些不同 1、类库引入已经相关测试 引

amao1998的博客 9965

python if 语句

检查两个值是否相等, 用 == day = "sunny" if day == "sunny": //由于变量day的值是sunny,因此通过这条条件测序,python就会执行紧跟在if语句后面的代码块 print("Excellent") //输出结果为: Excellent 检查两个值不相等, 用!= day = "rainy" if day != "sunny": prin...

AlwaysSpring的博客 644

TSP、MTSP问题遗传算法详细解读及python实现

写在前面 遗传算法是一种求解NPC问题的启发式算法,属于仿生进化算法族的一员。仿生进化算法是受生物行为启发而发明的智能优化算法,往往是人们发现某种生物的个体虽然行为较为简单,但生物集群通过某种原理却能表现出智能行为。于是不同的人研究不同的生物行为原理,受到启发而发明出新的仿生进化算法。比如免疫优化算法,蚁群算法,模拟退火算法等,这些算法以后也会简单介绍。 本文的主题是遗传算法,该算法也是受到生物行为启发。物竞天择,适者生存,优胜劣汰,是该优化算法的核心思想。笔者在业务中需要用到遗传算法求解TSP问题,但是网

weixin_47675950的博客 9306

# 多用户 JupyterHub 配置教程(通用 Linux 服务器版)

以上即是通用 Linux 服务器上的多用户 JupyterHub 实战配置。从安装认证与 Spawner 选择自动创建系统用户到反代与运维,覆盖了小团队到中等规模的主流场景。根据团队增长与合规要求,你可以进一步引入、统一身份源(LDAP/OAuth2/Keycloak)与资源配额治理,平滑演进到企业级部署。

数字化老司机 1288

mysql 存储过程使用游标时 DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE 会提前执行的坑...

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34029680的博客 5703

ADS入门学习笔记——射频振荡器的设计

振荡器是射频系统中的基本部件之一,可以将直流功率转换为射频功率,在特定的频率点建立起稳定的正弦振荡,成为所需的射频信号源。

weixin_42126696的博客 8949

python done()什么意思_done什么意思

done作为形容词使用的时候意思是:已完成的;煮熟的;合乎礼仪的;作为动词使用的时候意思是:做(do的过去分词);干。adj. 完成了的;煮熟的;对的;合乎礼仪的;累坏的,已完成的,完毕的,了结了的,结束的。注定完蛋的,因轻微违法行为受罚。int. (表示同意)好;行词汇搭配be done for 结束Easier said than done.说时容易做时难。... have done 结束be...

weixin_39776239的博客 4157

UDPProbe UDP端口存活探测(发送特征包+响应分析)、UDP服务识别

qDebug() << "收到响应:" << ip.toString() << ":" << port << " 服务:" << serviceName << " 响应长度:" << response.size();qDebug() << "开始探测:" << targetIp << ":" << port << " 超时时间:" << timeout << "ms";qInfo() << "\n==================== UDP探测结果 ====================";

寒寒豆豆软件公司的博客 147

Modelsim:LPDDR5仿真(含美光仿真模型官方sv&vcs代码)

虽然,三星在设计跟量产上,早于其他家存储产商,但是镁光后来居上了,是业界首家支持全速 LPDDR5 的供应商,并且开发者在做开发的时候,也是用美光颗粒比较多,所以这里就先以美光的仿真模型为主进行仿真。 本工程为美光官方工程,支持Modelsim、VCS、ncverilog三种仿真器仿真。模型破解过,为完整system-verilog代码。

千歌叹尽执夏的博客 1283

强化学习笔记:基于价值的学习之价值计算(python实现)

在强化学习中,根据是否依赖于模型,可以分为基于模型(model-based)的强化学习和无模型(model-free)的强化学习。根据策略的更新和学习方法,强化学习算法可以分为基于价值函数的学习方法和基于策略的学习方法。在基于价值函数的学习方法中,根据状态值函数(state-value function)的估计值,进行行动决策。比如说,从t时刻的状态出发,有K种行动可以选择:{},在各行动分别迁移到状态{那选择哪个动作呢?

chenxy_bwave的专栏 2695

【Windows Server 2019】发布服务器 | 远程桌面服务的安装与配置 Ⅰ——理论,实验拓扑和安装基于RemoteAPP的RDS

博客介绍了Windows Server中远程桌面服务的理论,实验拓扑以及基于RemoteAPP的RDS安装。博文介绍了如何在Windows Server上部署发布服务器。

VMware, Windows, Linux, Cisco, Container, Kubernetes, Kali 6128

ES6 学习14 Generator函数

1.Generator 函数 1.1.概述 Generator 函数是 ES6 提供的一种异步编程解决方案,语法行为与传统函数完全不同。 Generator 函数有多种理解角度。语法上,首先可以把它理解成,Generator 函数是一个状态机,封装了多个内部状态。 执行 Generator 函数会返回一个遍历器对象,也就是说,Generator 函数除了状态机,还是一个遍历器对象生成函数。返...

pspxuan的博客 208

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

es6 generator函数

  es6 新增了Generator函数,一种异步编程的解决方案     回顾一下,es6 提供了新的遍历方法,for of ,适用于各种数据集合,统一了遍历操作,原生支持for of 集合的数据集合有。数组,字符串   一部分的类数组,map,set。而对象是不适合与 for of 遍历的,因为原生没有实现Iterator接口,而手动的为对象添加Iterator接口,我们之前使用 ...

weixin_30488313的博客 148

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

ES6学习笔记(十四)Generator函数

清明时节雨纷纷,路上行人欲断魂。 借问酒家何处有,牧童遥指杏花村。 二零一九年农历三月初一,清明节。 1.简介 1.1.基本概念 Generator 函数也是 ES6 提供的一种异步编程解决方案,据说在Promise没有诞生之前就靠Generator,但由于用起来比较困难而被取代了。 Generator 函数有多种理解角度。语法上,首先可以把它理解成,Generator 函数是一个状态...

weixin_30468137的博客 213

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

ES6开发必备基本用法

ECMAScript 6.0(以下简称 ES6)是 JavaScript 语言的下一代标准,已经在 2015 年 6 月正式发布了。它的目标,是使得 JavaScript 语言可以用来编写复杂的大型应用程序,成为企业级开发语言ES6 既是一个历史名词,也是一个泛指,含义是 5.1 版以后的 JavaScript 的下一代标准,涵盖了 ES2015、ES2016、ES2017 等等,而 ES2015 则是正式名称,特指该年发布的正式版本的语言标准。...

niuroufen5的博客 8797

学习笔记之ES6

来源: http://es6.ruanyifeng.com/#README

小于零等于二的博客 1850

es6学习笔记

ECMAScript 和 JavaScript历史版本ES6(ES2015) 支持的环境 IE10+, Chrome, FireFox, 移动端, NodeJS解决不兼容办法,编译、转换Babel 中文网var 的问题let 和 const块级作用域举例 5.函数-参数 参数扩展/展开 收集剩余的参数,必须当到最后一个参数位置 展开数组,简写,效果和直接把数组的内容写在这儿一样 默认参数 6.解构赋值 解构赋值 左右两个边结构必须一样 右边必须是个东西 声明和赋值赋值不能分开,必须在一

luckydog 262

es6最新语法(包含promise,generator函数,async函数以及axios异步操作)

1. 企业级开发 es6 + 企业级框架vue 1) 项目结构 取决于脚手架(vue-cli) $ vue create zhaopin node_modules public src dist() 2) 脚手架中存在静态服务器 $ yarn serve 3) 打包 $ yarn build 4) 项目版本控制 git/svn 5) 部署 2...

stylefashon的博客 1221

day14 ES5和ES6

day14

yuan1723936262的博客 363

ES6中的Generator函数

今天小编发现一个es6中的新概念,同时也接触到了一个新关键字yeild,下面我就简单和大家聊聊es6中的generator函数。大家还可以关注我的微信公众号,蜗牛全栈。在后续的React中间件会有相应的应用。 一、函数声明:在function和函数名之间存在星号,并使用关键字yeild function* foo(){ for(let i = 0;i<3;i++){ console.log(i) // 什么也没输出 yield i } } con

q709971076的博客 188

怎么理解ES6中 Generator的?异步解决方案

一、介绍Generator 函数是 ES6 提供的一种异步编程解决方案,语法行为与传统函数完全不同回顾下上文提到的解决异步的手段:回调函数promise那么,上文我们提到promsie已经是一种比较流行的解决异步方案,那么为什么还出现Generator?甚至async/await呢?该问题我们留在后面再进行分析,下面先认识...

weixin_40331857的博客 71

JavaScript ES5 vs ES6 核心特性对比

ES6(ECMAScript 2015)引入了大量现代化语法和新特性,使 JavaScript 更加简洁、易读、易维护。以下是 ES5 与 ES6 的核心特性详细对比。特性ES5ES6变量声明var(函数作用域)letconst(块级作用域)函数function声明箭头函数、默认参数、剩余参数字符串拼接、转义模板字符串、插值、多行对象完整写法属性简写、方法简写、计算属性数组mapfilterreducefindincludesArray.from、扩展运算符异步回调函数Promise(后续)

csdn_silent的博客 1350

ES6学习14章:异步操作和Async函数

异步操作 在ES6,异步编程的方法有:回调函数、事件监听、发布/订阅、Promise对象。在ES7中,Async函数更是提出了异步编程的终极解决方案。 基本概念 异步: 简单说,异步即一个任务分成两段,先执行第一段,然后转而执行其他任务,等做好了准备,再回头执行第二段。这种不连续的执行就叫做异步。(相应的,连接执行就叫做同步) 回调函数 JavaScript语

Sophie_U的博客 428

es5、es6、es7中的异步写法

1.1 es5 —— 回调 把异步执行的函数放进回调函数中是最原始的做法。 但是异步的层次太多时,出现的回调嵌套导致代码相当难看并且难以维护。 taskAsyncA(function () { taskAsyncB(function () { taskAsyncC(function () { ... }) }); }); 于是出现了很多异步流程控制的包。说白了就是把多层嵌套的异步代码展平了。 如async.js 和 bluebird/Promise。 1.1.

飞翔的熊blabla 846
上一篇: ES6学习笔记13 Iterator 和 for...of 循环
下一篇: ES6学习笔记15 Generator 函数的异步应用
PAT-python-zjw
博客等级 码龄10年 381粉丝 408原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值