深入浅出ES6教程『Symbol & generator』
大家好,本人名叫苏日俪格,大家叫我 (格格) 就好,在上一章节中我们学到了类和继承的用法,下面我们一起来继续学习Symbol & generator:
下面让我们来认识一下数据类型的新成员:Symbol,它的英文翻译是符号,还有一个注意点,他和其他数据类型不一样,Symbol本身不是一个构造函数,也是独一无二的值,下面来看一下具体用法:
let syml = Symbol('asdsa');console.log(syml); // Symbol(asdsa)console.log(typeof syml); // symbol
谨记:当Symbol被for...in循环当做key的时候,是输出不了的
当Symbol被当做属性名来用的时候:
let syml = Symbol();let json = { [syml]: 'aaa'}
Symbol一般可能会用在多人编码的时候,造成的变量名冲突的问题,不过这种低级错误相信大家一般不会犯的,因此能看得出来用处不大。下面让我们看一下generator,中文的意思是生成器,他是一个函数,是为了解决异步和深度嵌套的问题;,函数写法是function * show(){},声明变量用yield,有一个默认的返回值,执行的时候用next()方法,执行结果有两个参数,value(值)、done(函数中是否还含有其他代码没有执行完):
function * show(){ yield name = '苏日俪格'; yield age = 24; return 1; } let s = show(); console.log(s.next()); // {value: "苏日俪格", done: false} console.log(s.next()); // {value: 24, done: false} console.log(s.next()); // {value: 1, done: true} console.log(s.next()); // {value: undefined, done: true}
正如例子中所看到的,最后执行完了就是undefined
小白:这种看起来也挺好理解的,但是写的太麻烦了,对于next()有没有简写形式呢?
格格:机智如你( σ'ω')σ
还记得我们前面学的for...of循环不:
function * show(){ yield name = '苏日俪格'; return 1; }let s = show();for (let item of s) { console.log(item); // 苏日俪格}
该函数也可以配合解构赋值和扩展运算符来用:
function * show(){ yield name = '苏日俪格'; yield age = 24; yield job = '前端开发'; }let [a,b,c,d] = show();let [e,...f] = show();console.log(a,b,c,d); // 苏日俪格 24 前端开发 undefinedconsole.log(e,f); // 苏日俪格 [24, "前端开发"]console.log(...show()); // 苏日俪格 24 前端开发
还可以和Array.from()配合,直接将generator函数直接放进数组输出:
function * show(){ yield name = '苏日俪格'; yield age = 24; yield job = '前端开发'; }console.log(Array.from(show())); // ["苏日俪格", 24, "前端开发"]
关于generator的一些玩法先介绍这么多,下面来介绍一下它到底是如何处理异步的:
<script class="lazyload" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB/AAffA0nNPuCLAAAAAElFTkSuQmCC" data-original="https://unpkg.com/axios/dist/axios.min.js"></script><script type="text/javascript">function * show(){ let name = yield 'yufy1314'; yield axios.get(`https://api.github.com/users/${name}`); }let s = show();let username = s.next().value;let prom = s.next(username).value; prom.then(res =>{ console.log(res.data); // 输出的是我们的github API一样的个人信息});// username 是第一次获取的值 也就是函数中的name// prom 是第二次获取的值 是一个promise对象 也就是axios的交互机制</script>
关于异步的处理方式就很尴尬了,因为我也不太会(lll¬ω¬),还是参考阮一峰大大的吧:http://www.ruanyifeng.com/blog/2012/12/asynchronous%EF%BC%BFjavascript.html
关于Symbol & generator我们都已经了然于心,预知async函数如何,请听下回分解 (^∀^)/~~~
本文的所有内容均是一字一句敲上去的,希望大家阅读完本文可以有所收获,因为能力有限,掌握的知识也是不够全面,欢迎大家提出来一起分享!谢谢O(∩_∩)O~
作者:苏日俪格
链接:https://www.jianshu.com/p/8aec01bb9074
共同学习,写下你的评论
评论加载中...
作者其他优质文章