迭代器

// 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学习第八天

    DOM访问列表框.下拉菜单的常用属性: form返回列表框.下拉菜单所在的表单对象; length返回列表框.下拉菜单的选项个数; options返回列表框.下拉菜单里所有选项组成的数组; defau ...

  2. JavaScript map+parseInt 容易产生的误区

    map /** * 语法: * var new_array = arr.map(function callback(currentValue[,index[,array]]){ * // return ...

  3. java实现一个简单的爬虫小程序

    前言 前些天无意间在百度搜索了一下以前写过的博客 我啥时候在这么多不知名的网站上发表博客了???点进去一看, 内容一模一样,作者却不是我... 然后又去搜了其他篇博客,果然,基本上每篇都在别的网站上有 ...

  4. equals&hashCode

    经典规则:如果重写了equals,必须重写hashCode 为什么??? 这个规则考虑的应用场景:如果你的对象可能放入HashMap,HashSet,不重写会出问题 问题场景: new一个对象,重写了 ...

  5. 年轻的樵夫哟,你掉的是这个免费 8 核 4G 公网服务器,还是这个随时可用的 Docker 实验平台?

    小孩子才做选择,成年人全都要.那么我们现在就来看看如何获得一台免费的 8 核 4G 公网 Docker 实验平台服务器. Play With Docker 直接打开 https://labs.play ...

  6. Nginx同时支持Http和Https

    现在的网站支持Https几乎是标配功能,Nginx能很好的支持Https功能.下面列举一个配置同时支持Http和Https的功能. 需要注意的是:既然选择使用Https,就是为了保证通信安全,那么就没 ...

  7. 『JWT』,你必须了解的认证登录方案

    我是风筝,公众号「古时的风筝」,一个兼具深度与广度的程序员鼓励师,一个本打算写诗却写起了代码的田园码农! 文章会收录在 JavaNewBee 中,更有 Java 后端知识图谱,从小白到大牛要走的路都在 ...

  8. apache+djnago+websocket 部署配置

    部署Apache服务器 1.apache服务的安装这里不做赘述,因为网上一大堆. 链接:https://blog.csdn.net/qq_24394093/article/details/905501 ...

  9. 从一个小需求感受Redis的独特魅力

    分享一个简单的小需求应该怎么设计实现以及有关Redis的使用 Redis在实际应用中使用的非常广泛,本篇文章就从一个简单的需求说起,为你讲述一个需求是如何从头到尾开始做的,又是如何一步步完善的. 需求 ...

  10. Java多线程_ReentrantLock

    ReentrantLock是重入锁,它与synchronized很像,它是synchronized的加强版,因为它具有一些synchronized没有的功能.下面我们看看两者的区别:synchroni ...