迭代器

// log
let arr = ['一', '二', '三']
let iter = arr[Symbol.iterator]()
console.log(iter.next())
console.log(iter.next())
console.log(iter.next())
console.log(iter.next())
// log
let args = {
info: 'some country or region',
list: ['china', 'USA', 'china hk'],
}
for (let item of args) {
console.log(item)
}
// log
let args = {
info: 'some country or region',
list: ['china', 'USA', 'china hk'],
[Symbol.iterator]() {
// 索引变量
let index = 0
return {
next: () => {
if (index < this.list.length) {
const result = { value: this.list[index], done: false }
index++
return result
} else {
return { value: undefined, done: true }
}
},
}
},
}
for (let item of args) {
console.log(item)
}

生成器

// log
function* gen() {
console.log('gen')
}
let iterator = gen()
iterator.next()
// log
function* gen() {
console.log('窗前明月光')
yield
console.log('疑是地上霜')
yield
console.log('举头望明月')
yield
console.log('低头思故乡')
yield
}
// 测试next()调用
let iterator = gen()
iterator.next()
iterator.next()
iterator.next()
iterator.next()
// log
function* gen() {
console.log('窗前明月光')
yield 'A'
console.log('疑是地上霜')
yield 'B'
console.log('举头望明月')
yield 'C'
console.log('低头思故乡')
yield 'D'
console.log('完')
}
// 测试next()调用的返回值
let iter = gen()
console.log(iter.next())
console.log(iter.next())
console.log(iter.next())
console.log(iter.next())
// log
function* gen(param) {
console.log('窗前明月光' + param)
let a = yield 'A'
console.log('疑是地上霜' + a)
let b = yield 'B'
console.log('举头望明月' + b)
let c = yield 'C'
console.log('低头思故乡' + c)
let d = yield 'D'
} let iter = gen('param参数')
console.log(iter.next('next参数一'))
console.log(iter.next('next参数二'))
console.log(iter.next('next参数三'))
console.log(iter.next('next参数四'))

生成器与异步

setTimeout(() => {
// log-async
console.log(1)
setTimeout(() => {
// log-async
console.log(2)
setTimeout(() => {
// log-async
console.log(3)
}, 100)
}, 100)
}, 100)

遇到 yield,就要停一下。

function* gen() {
yield one()
yield two()
yield three()
}
function one() {
setTimeout(() => {
// log-async
console.log(1)
}, 100)
} function two() {
setTimeout(() => {
// log-async
console.log(2)
}, 100)
} function three() {
setTimeout(() => {
// log-async
console.log(3)
}, 100)
} let iter = gen()
iter.next()
iter.next()
iter.next()
function* gen() {
let data1 = yield one()
let data2 = yield two()
let data3 = yield three()
// log-async
console.log(data3)
} let iter = gen() function one() {
setTimeout(() => {
let data = '用户数据'
// log-async
iter.next(data)
}, 100 * Math.random())
} function two() {
setTimeout(() => {
let data = '订单信息'
// log-async
iter.next(data)
}, 100 * Math.random())
} function three() {
setTimeout(() => {
let data = '产品信息'
// log-async
iter.next(data)
}, 100 * Math.random())
}
iter.next()

Promise

封装 Ajax

const p = new Promise((resolve, reject) => {
let xhr = new XMLHttpRequest()
xhr.open('GET', 'https://api.apiopen.top/get')
xhr.send()
xhr.onreadystatechange = function () {
if (xhr.readyState === 4) {
if (xhr.status >= 200 && xhr.status < 300) {
resolve(xhr.response)
} else {
reject(xhr.status)
}
}
}
})
p.then(null, (err) => {
// log-async
console.log(err)
})

细节:发出承诺起即new Promise()后,就开始执行里面的代码了,.then的作用将回调传进+链式调用。

new Promise((resolve, reject) => {
// log-async
console.log('开始同步了')
setTimeout(() => {
// log-async
console.log('开始异步了')
resolve(0)
}, 100)
})

then 方法返回一个 Promise

如果 then 里面不 return

  1. 返回之前的 promise

如果 then 里面 return

  1. return 非 promise:返回之前的 promise
  2. return promise:返回新的 promise
// log
let p = new Promise((resolve, reject) => {
console.log('开始同步了')
})
let res = p.then()
console.log(res[Symbol.toStringTag])

Symbol.toStringTag

相关原理见promise 原理

Set

ES6语法笔记的更多相关文章

  1. ES6 语法笔记

    //如果使用let,声明的变量仅在块级作用域内有效 { var a = 1; let b = 2; } console.log(a); // 1 console.log(b); // Uncaught ...

  2. JavaScript代码/ES6语法笔记一

    1. new Set()/去重一个数组 let arr = [1, 2, 2, 3, 3]; let set = new Set(arr); let newArr = Array.from(set); ...

  3. Webpack4 学习笔记三 ES6+语法降级为ES5

    前言 此内容是个人学习笔记,以便日后翻阅.非教程,如有错误还请指出 Webpack 将es6.es7语法降级为es5 需要通过 babel JavaScript编译器. 安装: npm i babel ...

  4. ES6入门笔记

    ES6入门笔记 02 Let&Const.md 增加了块级作用域. 常量 避免了变量提升 03 变量的解构赋值.md var [a, b, c] = [1, 2, 3]; var [[a,d] ...

  5. es6学习笔记--解构赋值

    昨天学习了es6语法中解构赋值,解构赋值在声明中和函数传参提高了灵活性和便捷性,值得掌握该语法. 概念: ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构.   数组的解构 ...

  6. es6学习笔记--字符串&数值&数组&函数&对象的扩展

    这几天抽空学习了es6语法,关于字符串,数值,数组,函数以及对象的扩展,看到es6标准入门这本书,里面讲的扩展特别多,我认为有几部分在项目上用不到,就挑有用的当笔记学习了. 字符串的扩展 str.in ...

  7. es6学习笔记--新数据类型Symbol

    学习了es6语法的symbol类型,整理笔记,闲时复习. Symbol 是es6新增的第七种原始数据类型(null,string,number,undefined,boolean,object),是为 ...

  8. ES6学习笔记<三> 生成器函数与yield

    为什么要把这个内容拿出来单独做一篇学习笔记? 生成器函数比较重要,相对不是很容易理解,单独做一篇笔记详细聊一聊生成器函数. 标题为什么是生成器函数与yield? 生成器函数类似其他服务器端语音中的接口 ...

  9. ES6学习笔记<二>arrow functions 箭头函数、template string、destructuring

    接着上一篇的说. arrow functions 箭头函数 => 更便捷的函数声明 document.getElementById("click_1").onclick = ...

随机推荐

  1. The Definitive Guide to Ruby's C API The Ruby C API Running Ruby in C Running C in Ruby

    最近在研究如何在C/C++中 嵌入ruby脚本,很感谢找到了一篇文章,分享一下. The Definitive Guide to Ruby's C API

  2. vue element Admin - 修改浏览器标签名 + 添加tagView标签 +固定导航头部 + 添加侧边栏Logo

    1 .修改浏览器标签名称: 修改浏览器标签名称在文件:\src\settings.js   image.png 2 .修改固定头部Header和侧边栏 Logo:   image.png 1)侧边栏文 ...

  3. jQuery的基础效果题

    Jquery第二次考核 之真金不怕火炼 1.  名词解释 实例对象:var p1=new Person();  p1就是实例对象 构造:function Person(){} 原型对象:在 JavaS ...

  4. 带你用 Python 实现自动化群控设备

    1. 前言 群控,相信大部分人都不会陌生!印象里是一台电脑控制多台设备完成一系列的操作,更多的人喜欢把它和灰产绑定在一起! 事实上,群控在自动化测试中也被广泛使用!接下来的几篇文章,我将带大家聊聊企业 ...

  5. 【Spring注解驱动开发】如何实现方法、构造器位置的自动装配?我这样回答让面试官很满意!

    在 冰河技术 微信公众号前面的文章中,我们介绍了如何使用注解来自动装配Spring组件.之前将的都是在来的字段上添加注解,那有没有什么方法可以实现方法.构造器位置的自动装配吗?今天我们就一起来探讨下如 ...

  6. 关于“类.class”和“类.this”

    今天在浏览知乎的时候,看到了这个问题,感觉很多人说的不清楚.问题链接:Java 类名.class与类名.this 的区别? 话说它有什么区别呢?从API层面上来说,"类.class" ...

  7. Jmeter系列(51)- 详解 Transaction Controller 事务控制器

    如果你想从头学习Jmeter,可以看看这个系列的文章哦 https://www.cnblogs.com/poloyy/category/1746599.html 简单介绍 可以添加多个取样器(samp ...

  8. 个人项目wc

    github地址:https://github.com/YTFFBX/wc 1.题目描述 Word Count1. 实现一个简单而完整的软件工具(源程序特征统计程序).2. 进行单元测试.回归测试.效 ...

  9. 怎样使用laravel的脚手架安装bootstrap

    第一步.使用composer引入laravel中的ui库 composer require laravel/ui --dev 第二步.生成bootstrap的基本脚手架 php artisan ui ...

  10. IDEA下Maven项目搭建踩坑记----2.项目编译之后 在service层运行时找不到 com.dao.CarDao

    项目写的差不多 想运行一下,然后发现运行到Service层的时候报错说找不到Dao层文件 ,纠结半天之后看了下编译好的项目文件,发现mapper文件下边是空的, 于是就百度找一下原因,结果说是IDEA ...