大家好,本人名叫苏日俪格,大家叫我 (格格) 就好,在上一章节中我们学到了类和继承的用法,下面我们一起来继续学习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,喜欢的可以star,项目随意fork,支持转载但要下标注,同时恭候:个人博客