为了账号安全,请及时绑定邮箱和手机立即绑定

深入浅出ES6教程『Symbol & generator』

标签:
JavaScript

大家好,本人名叫苏日俪格,大家叫我 (格格) 就好,在上一章节中我们学到了类和继承的用法,下面我们一起来继续学习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


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消