ES6学习日记 4

学习日志

三月11日

一,generator函数

  1,声明 Generator函数

  💡function后面加个 *

	function* fn(){   
		console.log("我是生成器函数")
	 	yield '我是生成器函数2'
	}
  2,调用Generator函数

  💡调用生成器函数 需要next()

	let item = fn()
	console.log(item)// 返回一个generator对象,对象的原型上有一个next(),调用返回对象{value:yield后面的值,done}
	console.log(item.next());
	//我是生成器函数  
	//{value: '我是生成器函数2', done: false}
  3,yield语句的使用

  💡yield和return的区别
  yield:暂停执行,调用next()继续执行
  return:结束执行

	function* fn() {
        console.log('我是生成器函数');
        yield '我是生成器函数2'
        console.log('我是生成器函数3');
        yield '我是生成器函数4'
        console.log('我是生成器函数5');
    }
    let a = fn()
   	console.log(a.next()) // 我是生成器函数  {value: '我是生成器函数2', done: false}
   	console.log(a.next()) // 我是生成器函数3 {value: '我是生成器函数4', done: false}
   	a.next() // 我是生成器函数5
  4,next方法接收参数

  💡next( )方法还可以接受一个参数,它的参数会作为上一个yield的返回值

	function* fn(){
	   let a = yield '123'
	   let b = yield a
	}
	let fn_1 = fn()
	console.log(fn_1.next()); // {value: '123', done: false}
	console.log(fn_1.next('456')); // {value: '456', done: false}
  5,关键字‘yield*’

  💡在一个Generator函数里面,如果我们想调用另一个Generator函数,就需要用到的关键字是:yield*

	    function* fn(){
        yield "123"
        yield "abc"
    }
    function* fn_1(){
        yield "456"
        yield "def"
    }
    function* fn_2(){
        yield* fn()
        yield* fn_1()
        yield "789"
        yield "ghi"
    }
    let a = fn_2()
    console.log(a.next()); // {value: '123', done: false}
    console.log(a.next()); // {value: 'abc', done: false}
    console.log(a.next()); // {value: '465', done: false}
    console.log(a.next()); // {value: 'def', done: false}
    console.log(a.next()); // {value: '789', done: false}
    console.log(a.next()); // {value: 'ghi', done: false}

  Generator函数的用途:
  可以控制函数的内部状态,依次遍历每个状态;可以根据需要,轻松地让函数暂停执行或者继续执行。
  根据这个特点,我们可以利用Generator函数来实现异步操作的效果。
  原理是:利用Generator函数暂停执行的作用,可以将异步操作的语句写到yield后面,通过执行next方法进行回调。




二,类基本用法

  1,类的属性和方法

  💡声明一个类的写法

    class Animal {
        constructor(name){
            this.name = name
        }
     }

   🙈 通过关键字class来声明一个名字叫Animal的类,可以看到类里面(花括号 {}里面)有一个叫constructor
  (构造、建造)方法,它就是构造方法,构造方法里面的this,指向的是该类实例化后的对象,这就是实现了一个类的声明。
   💟其中,构造方法constructor是一个类必须要有的方法,默认返回实例对象;
   ❤️创建类的实例对象的时候,会调用此方法来初始化实例对象。
   ❤️‍🩹如果你没有编写constructor方法,执行的时候也会被加上一个默认的空的constructor方法。

  2,类的自定义方法

  🙈我们把类名后面的括号{ }里面的内容称之为类体,我们会在类体内来编写类的属性和方法。
  🙉其中constructor方法是构造方法,在实例化一个类的时候被调用。
  🙊constructor方法是必须的,也是唯一的,
  🐵我们可以在方法里面自定义一些对象的属性

    class Animal {
        constructor(name){
            this.name = name
        }
        getname(){
            console.log(this.name);
            console.log(this);//构造方法里面的this,指向的是该类实例化后的对象
        }
     }

  3,类的实例化对象

注意事项:
  1.必须使用new创建字来创建类的实例对象
  2.先声明定义类,再创建实例,否则会报错

    class Animal {
        constructor(name){
            this.name = name
        }
        getname(){
            return console.log(`这是${ren.name}`);
        }
     }
      let ren =new Animal("一个人")
      console.log(ren.name);// 一个人
      ren.getname() //这是一个人
  4,类的静态方法

  如果在一个方法前,加上static关键字,就表示该方法不会被实例继承,而是直接通过类来调用,这就称为“静态方法”

    class Animal {
        constructor(name){
            this.name = name
        }
           static getAge() {
            console.dir(this);//this指向本身  class Animal
        }
     }
	 Animal.getAge() //类的静态方法可以被类直接调用
  5,类的继承

  使用extends关键字来实现子类继承父类
  关键字super,它相当于是父类中的this

❗使用super有几个要注意的事项:
  子类必须在constructor方法中调用super方法
  调用super( ),才可以使用this,否则报错

 	class Animal {   //父类
        constructor(name, age) {
            this.name = name
            this.age = age
        }
        getName() {
            console.log(`有只猫叫${this.name},是一只${this.color}颜色的猫,它${this.age}岁了`);
        }
    }

	class Cat extends Animal {  //子类Cat继承父类Animal 的属性和方法
        constructor(name, age, color) {
            // super 指代的父类 
            super(name, age)
            // 写在super下面 因为this指向问题
            this.color = color
        }
    }
     let cat = new Cat('加菲', 3, 'yellow') //给子元素Cat传值
     cat.getName() //调用父元素的方法
     //输出  有只猫叫加菲,是一只yellow颜色的猫,它3岁了

  在父类中,我们定义了方法,想要在子类中调用父类的方法的话,我们使用super.方法( )即可实现。


三,Set 和 WeakSet用法


 1.Set的用法

  什么是set
  Set是ES6给开发者带来的一种新的数据结构,你可以理解为值的集合。
  我们平时见到的数组Array也是一种数据结构,但是Set跟其他数据结构不同的地方就在于:它的值不会有重复项。


  1.1 set的基本用法

Set的用法:👇

	var y = new Set()
    console.log(y)// Set(0) {size: 0}

  Set本身是一个构造函数,你可以理解为一个类,使用的时候需要用new来创建一个实例。
  用数组[ 1,2,3 ]作为参数传入,得到的变量s为Set { 1, 2, 3 }

	var y = new Set([1,2,3])
    console.log(y)//Set(3) {1, 2, 3}

如果你不想用数组作为参数来传值初始化变量s,你还可以通过Set 结构提供的add方法来添加方法

	var y = new Set();
	y.add(1);
	y.add(2);
	y.add(3);
	console.log(y);//Set(3) {1, 2, 3}
  1.2 成员值唯一

  😊为Set 结构添加成员值的时候,要注意一点是,set结构的成员值是没有重复的,每个值都是唯一的
  😒set结构会自动忽略相同的值,只会保留一个相同的值

	var y = new Set();
	y.add(1);
	y.add(1);
	console.log(y);//Set(1) {1}
  1.3 size属性

  🤷‍♂️size属性:获取成员的个数

	var y = new Set([1,2,3])
	y.size // 3 
  1.4 delete属性

  🤦‍♂️delete( )方法:用户删除Set结构中的指定值,删除成功返回:true,删除失败返回:fasle。

	var y = new Set([1,2,3])
	y.delete(2)//true
	y.delete(6)//false
	console.log(y) //Set(2) {1, 3}
  1.5 clear方法

  👌clear( )方法:清除所有成员

	var y = new Set([1,2,3])
	y.clear()
	console.log(y) //Set(0) {size: 0}
  1.6 has方法

  😘has( )方法:判断set结构中是否含有指定的值。如果有,返回true;如果没有,返回fasle。

	var y = new Set([1,2,3])
	y.has(1)//true
	y.has(4)//false
  1.7 enteries方法

  👍entries( )方法:返回一个键值对的遍历器。

	var y = new Set([1,2,3])
	console.log(y.entries());//SetIterator {1 => 1, 2 => 2, 3 => 3}

  😎得到的结果,成员值“a”对应的键值对是 [1 => 1] ,也就是说:Set结构是键名和键值是同一个值。

  1.8 keys和values方法

  keys( )方法:返回键名的遍历器。
  values( )方法:返回键值的遍历器。

	var y = new Set([1,2,3])
	y.keys()  //SetIterator {1, 2, 3}
	y.values() //SetIterator {1, 2, 3}
  1.9 forEach方法

  😗forEach( )方法:遍历每一个成员。

	var y = new Set([1,2,3])
 	y.forEach(function(value,key){
 	console.log(value,key);
 	})
 	// 1 1
	// 2 2
	// 3 3
  1.10 set用途之一

  🫥 功能之一去重

	let arr = [1,1,1,2,2,2,3,3,3,4,4,4]
	var y = new Set(arr)
	let arr_1=Array.from(y)
	console.log(arr_1) //[1, 2, 3, 4]

 2.WeakSet的用法

  WeakSet结构同样不会存储重复的值,不同的是,它的成员必须是引用类型。
  任何可遍历的对象,都可以作为WeakSet的初始化参数。

  2.1 Weakset结构
var y = new WeakSet([{name: "xw"}])
console.log(y);


四,Map 和 WeakMap 用法

 1.Map的用法

 2.WeakMap的用法



五,Promise 用法

  Promise设计初衷:
  解决回调函数层层嵌套(又称:回调地狱)的形式存在缺点

   Promise基本用法

  😎基本用法:promise 承诺
  🐵参数是一个匿名函数,其中有两个参数:resolve(解决)和reject(拒绝),两个函数均为方法
  😗resolve方法用于处理异步操作成功后业务;reject方法用于操作异步操作失败后的业务。

let  pro = new Promise(function(resolve,reject){

});
   Promise的三种状态

 ❗Promise对象有三种状态:
  pending:刚刚创建一个Promise实例的时候,表示初始状态;等待
  fulfilled:resolve方法调用的时候,表示操作成功;
  rejected:reject方法调用的时候,表示操作失败;

 ❗状态只能从 初始化 -> 成功 或者 初始化 -> 失败,不能逆向转换,也不能在成功fulfilled 和失败rejected之间转换。

	let  pro = new Promise(function(resolve,reject){
	//Promise {<pending>}
	if("操作成功或者操作失败"){
	resolve() //{<fulfilled>: undefined}  成功执行resolve()之后
	}else{
	reject() //{<rejected>: undefined}	失败执行reject()之后
	}
	
	});

  ❗初始化实例后,对象的状态就变成了pending;当resolve方法被调用的时候,状态就变成了:成功fulfilled;当reject方法被调用的时候,状态就会有pending变成失败rejected。

   Then方法

  操作成功的处理程序 --是异步的
  ❗❗❗❗❗❗下一个then方法的参数是上一个then的返回值

	let  pro = new Promise(function(resolve,reject){
        resolve("执行成功"); //比如执行成功
	});
    pro.then(function(res){ //操作成功的处理程序
        console.log(res);  //输出  执行成功
    })
   Catch方法

  操作失败的处理程序 --是异步的
  catch只接受一个参数,用于处理操作异常后的业务。

	let  pro = new Promise(function(resolve,reject){
        reject("执行失败"); //比如执行失败
	});
    pro.then(function(res){ 
        console.log(res);  
    }).catch(function(error){ //操作失败的处理程序
        console.log(error); //输出  执行失败
    })
   Promise.all方法

  Promise.all( )方法:接受一个数组作为参数,数组的元素是Promise实例对象,当参数中的实例对象的状态都为fulfilled时,Promise.all( )才会有返回。

    let pro =new Promise(function(resolve){
        setTimeout(function(){
            resolve('实例1操作成功');
        },1000)
    })
    let pro2 =new Promise(function(resolve){
        setTimeout(function(){
            resolve('实例2操作成功');
        },3000)
    })
    Promise.all([pro,pro2]).then(function(result){
        console.log(result); //['实例1操作成功', '实例2操作成功']

    })
   Promise.race方法

  🫥Promise.race()方法:它的参数要求跟Promise.all( )方法一样,不同的是,它参数中的promise实例,只要有一个状态发生变化(不管是成功fulfilled还是异常rejected),它就会有返回,其他实例中再发生变化,它也不管了

    let pro = new Promise(function (resolve) {
        setTimeout(function () {
            resolve('实例1操作成功');
        }, 2000)
    })
    let pro2 = new Promise(function (reject) {
        setTimeout(function () {
            reject('实例2操作失败');
        }, 3000)
    })
        Promise.race([pro,pro2]).then(function(result,reject){
           console.log(result);
       }).catch(function(error){
           console.log(error);
       }) 
  • 62
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值