美文网首页我爱编程让前端飞JavaScript 进阶营
深入浅出ES6教程『Symbol & generator

深入浅出ES6教程『Symbol & generator

作者: 苏日俪格 | 来源:发表于2018-06-08 12:15 被阅读12次

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

    github个人主页:https://github.com/YuFy1314
    我的博客:http://www.cnblogs.com/yufy/
    Resume:https://yufy1314.github.io/
    等一下( •́ .̫ •̀ ),我还有最后一句话:
    这里虽然没有都市的繁华,
    也没有山林的鸟语花香,
    只有一片如水的宁静,
    古人云:
    既来之则安之,
    既然来到了这里,
    就可以静心休憩你的灵魂,
    调养你疲惫的心,
    再见...

    相关文章

      网友评论

        本文标题:深入浅出ES6教程『Symbol & generator

        本文链接:https://www.haomeiwen.com/subject/vwowsftx.html