迭代器

// 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. JS学习第五天

    循环语句: for(变量 in (容器名)数组名){ 执行的语句块: break: 结束整个循环; continue:结束本次循环, 进入下一次循环: } 双层for循环: 外层循环控制行,内层循环控 ...

  2. 精灵小巧的 Jsonpath 万精油:Snack3

    前几天和一个群里的朋友交流一个需求:在 Json 里像 XPath 一样找出节点,并修改值,然后输出新的Json. 很多人马上就会说,Jsonpath 啊. 是的 Jsonpath 确实能快速找出节点 ...

  3. 简单快速搭建钓鱼wifi

    前言 钓鱼wifi是很久的话题了,但是传统的方法可能比较麻烦需要手动配置dhcp,dns,网卡,流量转发,比较麻烦,而且还有根据每次的网络环境需要重新的配置,这里介绍用WIFIpumpkin3工具简单 ...

  4. 《JVM G1源码分析和调优》读书笔记

    GC的相关算法与JVM的垃圾收集器 GC的相关算法 分代管理 复制算法 标记清除 标记压缩 JVM垃圾收集器 P242 表11-1 不同类型垃圾回收期比较 串行收集器 Serial. Serial G ...

  5. 【SCOI2013】摩托车交易 - 最大生成树+树链剖分

    题目描述 mzry1992 在打完吊针出院之后,买了辆新摩托车,开始了在周边城市的黄金运送生意.在mzry1992 生活的地方,城市之间是用双向高速公路连接的.另外,每条高速公路有一个载重上限,即在不 ...

  6. Windows 右键 照片查看器 不见了--解决办法

    桌面新建 一个文本文档,将下边复制进去,另存为命名例如为:1.reg 双击运行1.reg,点‘是’,点确认即可. Windows Registry Editor Version 5.00 ; Chan ...

  7. docker入门3-docker swarm

    swarm介绍 想要将应用部署在一个集群并运行在多台机器上? 通过将多台机器链接到"Dockerized"集群以实现应用程序运行在多容器,多机器的技术被称为swarm. 一个swa ...

  8. CentOS7 安装图形化桌面

    1.装好CentOS7后,我们一开始是上不了网的 (ping 百度报错:Name or service not know) 2.输入dhclient,可以自动获取一个IP地址,再用命令ip addr查 ...

  9. springMVC入门(七)------RESTFul风格的支持

    简介 RESTful风格(Representational State Transfer),又叫表现层状态转移,是一种开发理念,也是对HTTP协议很好的诠释 主要理念是将互联网中的网页.数据.服务都视 ...

  10. 数字货币比特币以太坊买卖五档行情数据API接口

    数字货币比特币以太坊买卖五档行情数据API接口       数字货币一般包含比特币BTC.以太坊ETH.瑞波币XRP.泰达币USDT.比特币现金BCH.比特币SV.莱特币LTC.柚子币EOS.OKB. ...