set、map与模块化

本文介绍了ES6中的Set和WeakSet数据结构,包括它们的用法、方法和属性,强调了两者之间的区别。接着讨论了Map和WeakMap,以及它们在存储和操作键值对上的特点。此外,文章还涵盖了Promise对象的状态和方法,如then和catch,以及Promise.all和Promise.race。最后,简述了ES7中的async/await语法,它是解决异步编程复杂性的一个工具。
摘要由CSDN通过智能技术生成

Set 和 WeakSet用法

什么是set

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

Set格式 let a = new Set([ ]); 使用add方法添加成员 成员值唯一

 结构除了提供add方法用于添加成员以外,还提供了哪些方法和属性呢?

size属性:获取成员的个数。 

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

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

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

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

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

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

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

Weakset结构

 WeakSet结构同样不会存储重复的值,不同的是,它的成员必须是对象类型的值。

同样,WeakSet结构也提供了add( ) 方法,delete( ) 方法,has( )方法给开发者使用,作用与用法跟Set结构完全一致。

        另一个不同点是:WeakSet 结构不可遍历。因为它的成员都是对象的弱引用,随时被回收机制回收,成员消失。所以WeakSet结构不会有keys( )values( )entries( )forEach( )等方法和size属性。

Map和WeakMap用法

什么是Map?

ES6 提供了Map结构给我们使用,它跟Object对象很像,但是不同的是,它的key键名的类型不再局限于字符串类型了,它可以是各种类型的值;可以说,它比Object对象更加灵活了,当然,也更加复杂了。

格式 let a=new Map([["name","前端"]])

set( )方法作用:给实例设置一对键值对,返回map实例。

 //数组类型的键名
m.set([1],2);

//对象类型的键名

m.set({"name":"Zhangsan"},2);

//布尔类型的键名

m.set(true,2);

//Symbol类型的键名

m.set(Symbol('name'),2);

//null为键名

m.set(null,2);

//undefined为键名

m.set(undefined,2);

  以上6种类型值都可以作为键名,可以成功添加键值对,没毛病。

使用set方法的时候有一点需要注意,如果你设置一个已经存在的键名,那么后面的键值会覆盖前面的键值。

get( )方法作用:获取指定键名的键值,返回键值。

let m = new Map([["name","前端君"]]);
m.get("name");//结果:前端君

m.get("gender");//结果:undefined

get方法使用也很简单,只需要指定键名即可。获取存在对应的键值,如果键值对存在,就会返回键值;否则,返回undefined

delete( )方法作用:删除指定的键值对,删除成功返回:true,否则返回:false

Set结构一样,Map结构也提供了clear( )方法,让你一次性删除所有键值对。

has( )方法作用:判断Map实例内是否含有指定的键值对,有就返回:true,否则返回:false

entries( )方法作用:返回实例的键值对遍历器。

let m = new Map([
    ["name","前端君"],

    ["age",25]

]);

for(let [key,value] of m.entries()){

    console.log(key+'  '+value);

}

//打印结果:name  前端君

//              age  25

keys( )方法:返回实例所有键名的遍历器。

values( ) 方法:返回实例所有键值的遍历器。

除了使用以上三个方法实现遍历以外,我们还可以使用forEach遍历每一个键值对

size:获取实例的成员数。

什么是WeakMap?

WeakMap结构和Map结构很类似,不同点在于WeakMap结构的键名只支持引用类型的数据。哪些是引用类型的值呢?比如:数组,对象,函数。

eakMap的基本用法

WeakMap结构的使用方式和Map结构一样:

 let wm = new WeakMap();

WeakMap与Map的区别?

如果是普通的值类型则不允许。比如:字符串,数字,nullundefined,布尔类型。而Map结构是允许的,这就是两者的不同之处,谨记。

Map一样,WeakMap也拥有gethasdelete方法,用法和用途都一样。不同地方在于,WeakMap不支持clear方法,不支持遍历,也就没有了keysvaluesentriesforEach4个方法,也没有属性size

ES6的Promise对象

Promise基本用法

我们就看看它的基本用法:promise 承诺

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

})

Promise的三种状态

Promise对象有三种状态:

        1.pending:刚刚创建一个Promise实例的时候,表示初始状态;

        2.fulfilledresolve方法调用的时候,表示操作成功;

        3.rejectedreject方法调用的时候,表示操作失败;

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

  then( )方法:用于绑定处理操作后的处理程序。

参数是两个函数,第一个用于处理操作成功后的业务,第二个用于处理操作异常后的业务。

  pro.then(function (res) {
        //操作成功的处理程序

    },function (error) {

        //操作失败的处理程序

    });

Catch方法

对于操作异常的程序,Promise专门提供了一个实例方法来处理:catch( )方法。

 pro.catch(function (error) {
        //操作失败的处理程序

    });

 catch只接受一个参数,用于处理操作异常后的业务。

  综合上面的两个方法,大家都建议将then方法用于处理操作成功,catch方法用于处理操作异常

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

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

ES7中 的Async/await

Promise虽然跳出了异步嵌套的怪圈,解决了回调地狱的问题,用链式表达更加清晰,但是我们也发现如果有大量的异步请求的时候,流程复杂的情况下,会发现充满了屏幕的then,看起来非常吃力,而ES7的Async/Await的出现就是为了解决这种复杂的情况。

async用于申明一个function是异步的,返回一个promise对象,而await可以认为是async wait的简写,等待一个异步方法执行完成。async必须声明的是一个functionawait必须在声明的函数内部使用。

基本语法

 

 Module模块

模块Module

模块Module:一个模块,就是一个对其他模块暴露自己的属性或者方法的文件。

在这里,我们会把module-A.jsmodule-B.js分别当作两个模块(moduleA模块和moduleB模块)来对待和处理。用这两个模块来演示如何暴露一个模块的属性或方法。

导出Export

导出Export:作为一个模块,它可以选择性地给其他模块暴露(提供)自己的属性和方法,供其他模块使用。

导入Import

导入Import:作为一个模块,可以根据需要,引入其他模块的提供的属性或者方法,供自己模块使用。

模块化的实现

模块B演示了导出

 模块B演示了导出,接下来我们用模块A来演示如何导入。

 批量导出

对于模块B,如果你想导出(暴露)多个属性和方法的话,你可以这样实现:

    而对于这种批量导出,我们导入的时候怎么对应上呢?

 同样,我们使用多个同名变量就可以获取对应的属性和方法,变量名字必须跟导出的一致才能准确获取,位置顺序无要求。

重命名导出的变量

 

使用关键字as,可以实现给变量name更换名字为myname。最后正确输出myname的值:“前端君”。

整体导入

 

默认导出

默认导出,每个模块支持我们导出一个没有名字的变量,我们使用关键语句export default来实现:

   

我们使用export default关键字对外导出一个匿名函数,导入这个模块的时候,可以为这个匿名函数取任意的名字,我们试一下导入上面那个匿名函数:

 声明的变量,对外都是只读的。 导入不存在的变量,会报错。

`map`是Vuex中提供的一个辅助函数,用于将store中的state、getters、mutations、actions等映射到组件中的computed、methods等中。 当我们在一个大型的项目中使用Vuex时,通常会将store分割成多个模块,每个模块负责管理一个特定的领域状态。为了避免不同模块之间的命名冲突,Vuex提供了命名空间(namespace)的概念。 命名空间可以通过在模块中添加`namespaced:true`来启用,这样就可以在组件中使用`mapState`、`mapGetters`、`mapMutations`、`mapActions`时指定模块的命名空间,例如: ```javascript // store/moduleA.js const moduleA = { namespaced: true, state: { ... }, getters: { ... }, mutations: { ... }, actions: { ... } } // 组件中使用mapState import { mapState } from 'vuex' export default { computed: { ...mapState('moduleA', { a: state => state.a, b: state => state.b }) } } // 组件中使用mapGetters import { mapGetters } from 'vuex' export default { computed: { ...mapGetters('moduleA', { c: 'getC', d: 'getD' }) } } // 组件中使用mapMutations import { mapMutations } from 'vuex' export default { methods: { ...mapMutations('moduleA', { setA: 'setA', setB: 'setB' }) } } // 组件中使用mapActions import { mapActions } from 'vuex' export default { methods: { ...mapActions('moduleA', { doActionA: 'doActionA', doActionB: 'doActionB' }) } } ``` 使用命名空间可以有效地管理模块的状态,避免了命名冲突。但是在使用`map`函数时,需要注意指定模块的命名空间,否则会出现无法正确获取模块内的状态和方法的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值