ES6_10、Symbol数据类型和generator函数

一、Symbol数据类型

注意:

  1. 使用typeOf检测的类型为symbol,是一个单独的数据类型,基本数据类型
  2. 使用Symbol 类型不用new
  3. 使用情况一般,一般作为唯一的key值使用
  4. 使用for...in循环来遍历Symbol作为key的对象,不能遍历出来,为对象私有的;
let s=Symbol("aaa");
console.log(typeof s);
let json={
	a:1,
	b:2,
	s:111
}
console.log(json.s)

二、关系函数generator

1、关系函数的作用:解决异步,深度嵌套

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>
	<button onclick="hello()">按钮</button>
</body>
</html>
<script>
	
function * show(){
	yield 'abc';
	yield 'def';
	yield 'hij';
}

let s=show();
function hello(){
	console.log(s.next());
// {value: "abc", done: false}
// {value: "def", done: false}
// value: "hij", done: true}
// {value: undefined, done: true}
}

</script>

2、for...of 循环会自动遍历generator函数,但是return的内容不会遍历出来

function * show(){
	yield 'abc';
	yield 'def';
	return 'hij';
}

let s=show();
for(let item of s){
	console.log(item);//abc def undefined
}

3、解构也可以遍历出generator函数,同样 return的内容不能解构出来

function * show(){
	yield 'abc';
	yield 'def';
	return 'hij';
}

let [a,b,c]=show();
console.log(a,b,c)//abc def undefined

4、扩展运算符也可以遍历...

5、Array.from()也可以用来遍历

6、案例

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
<body>
	
</body>
</html>
<script>
function * gen(){
	let val=yield 'aaa';
	yield axios.get(`https://api.github.com/users/${val}`);
}
let g=gen();
let userName=g.next().value;
// g.next('hello').value 是一个promise对象
g.next(userName).value.then(res=>{//传值,获取动态数据
	console.log(res.data);
})
</script>

7、同异步

异步:不连续,上一个操作没有执行完,下一个操作照样开始

同步:连续执行,上一个操作没有完成,下一个无法开始

关于异步的解决方案:

  1. 回调事件
  2. 事件监听
  3. 发布/订阅
  4. Promise对象

8、async与promise对比

async特点:

  1. await只能放到async函数中
  2. 相比generator函数,语义化更强
  3. await后面可以是promise对象,也可以是数字、字符串、布尔
  4. async函数返回的是一个promise对象;
  5. 只要await语句后面Promise状态变成reject,整个async函数会中断执行

注意:执行的方法:在控制台执行 找到当前文件所在的文件夹,执行 【node 文件名】运行文件

var fs = require('fs');

const readFile=function(fileName){
	return new Promise((resolve,reject)=>{
		fs.readFile(fileName,(err,data)=>{
			if(err) reject(err);
			resolve(data);
		})
	})
}	

readFile('data/a.txt').then(res=>{
	console.log(res.toString());
	return readFile('data/b.txt');
}).then(res=>{
	console.log(res.toString());
	return readFile('data/c.txt');
}).then(res=>{
	console.log(res.toString());
})
var fs = require('fs');

const readFile=function(fileName){
	return new Promise((resolve,reject)=>{
		fs.readFile(fileName,(err,data)=>{
			if(err) reject(err);
			resolve(data);
		})
	})
}	

async function fn(){
	let f1=await readFile('data/a.txt');//后边的结果需要等待
	console.log(f1.toString());
	let f2=await readFile('data/b.txt');
	console.log(f2.toString());
	let f3=await readFile('data/c.txt');
	console.log(f3.toString());
}
fn();
async function fn(){
	// return 'welcome';
	throw new Error('Error出错了');
}
console.log(fn());
fn().then(res=>{
	console.log(res);
},err=>{
	console.log(err);
})

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值