摘要:本身是一个构造函数,用来生成数据结构。结构具有的属性构造函数,默认是函数。举例链式删除某个键清空对象是一个构造函数,用来生成实例,是异步编程的一种解决方案。构造函数接受一个函数作为参数,该函数的两个参数分别是函数和。
1、 Set 和 Map数据结构 Set 数据结构
Set 类似数组,但是成员是唯一的,不存在重复值。
Set本身是一个构造函数,用来生成Set数据结构。
Set结构具有的属性:
- Set.prototype.constructor:构造函数,默认是Set函数。 - Set.prototype.size:返回Set的成员个数。
Set结构具有的方法
- add(value):添加值; - delete(value):删除值 - has(value):返回一个布尔值, - clear(): 清空所有成员
举例: var s = new Set(); //通过add方法向Set结构中加入成员 [1,2,3,3,4].map(x => s.add(x)) //Set结构不会添加重复值 console.log(s) //{1,2,3,4} console.log(s.size) //4 console.log(s.has(1)) //true s.delete(2) //删除某个值 console.log(s.has(2)) //false Array.from方法可以将Set结构转为数组。 const arr1 = [1,2,3,4]; const items = new Set(arr1); //{1,2,3,4} const array = Array.from(items) //[1,2,3,4] Set数组去重的方法: function dedupe(array){ return Array.from(new Set(array)); } dedupe([1,1,2,3]) //[1,2,3]Map 数据结构
Map 类似对象,也是键值对的集合,但是"键"的范围不限于字符串,各种类型的值(包括对象)都可以当作键。
Map本身也是构造函数,也可以接受一个数组作为参数
Map实例具有的属性:
- size属性:返回Map结构的成员总数
Map实例具有的方法: - set(key, value):设置键名key对应的键值value,然后返回整个Map结构,如果key已经存在,则键值更新; - get(key):读取key对应的键值,如果找不到key,返回undefined; - has(key):返回一个布尔值; - delete(key):删除某个键,返回布尔值; - clear(): 清除所有成员,没有返回值。 举例: let map = new Map(); map.set("name","liyong").set("age",10); console.log(map); //链式{"name" => "liyong","age"=>10} console.log(map.size); // 2 console.log(map.has("name")) // true console.log(map.get("name")) // "liyong" map.delete("name"); // 删除某个键 console.log(map.has("name")) // false console.log(map.get("name")) // undefined console.log(map.size) // 1 map.clear(); // 清空 console.log(map.size) // 02、 Promise 对象
Promise是一个构造函数,用来生成Promise实例,是异步编程的一种解决方案。
Promise构造函数接受一个函数作为参数,该函数的两个参数分别是函数resolve 和 rejected。
resolve函数作用是,异步操作成功后调用,并将异步操作结果作为参数传递出去;
reject函数的作用是,异步操作失败时调用,并将异步操作结果作为参数传递出去。
Promise的基本用法:
//方法1 let promise = new Promise((resolve, reject)=>{ if(success){ resolve(data) }else{ reject(err) } }) //方法2 function promise (){ return new Promise((resolve, reject)=>{ if(success){ resolve(a) }else{ reject(err) } }) } 实例化的Promise对象会立即执行。2.1 Promise.prototype.then()方法
Promise实例具有then方法,then方法是定义在原型对象Promise.prototype上的。then方法的第一个参数是resolved状态的回调函数,第二个参数(可选)是rejected状态的回调函数。
链式操作的用法:
//第一个函数runAsync1() function runAsync1(){ let p = new Promise((resolve, reject)=>{ setTimeout(()=>{ resolve("第一个回调成功") },1000) }); return p; } //第二个函数runAsync2() function runAsync2(){ let p = new Promise((resolve, reject)=>{ setTimeout(()=>{ reject("第二个回调失败") },2000) }); return p; } //第三个函数runAsync3() function runAsync3(){ let p = new Promise((resolve, reject)=>{ setTimeout(()=>{ reject("第三个回调成功") },3000) }); return p; } runAsync1() .then((data)=>{ console.log(data); return runAsync2(); },(error)=>{ console.log(err); return runAsync2(); }) .then((data)=>{ console.log(data); return runAsync3(); },(error)=>{ console.log(error); return runAsync3(); }).then((data)=>{ console.log(data) },(error)=>{ console.log(error) }) // 第一个回调成功 // 第二个回调失败 // 第三个回调成功2.2 Promise.prototype.catch()方法
Promise.prototype.catch方法是.then(null,()=>{})的别名,用于指定发生错误时的回调函数。
举例:
用Promise对象实现Ajax操作的例子 const getJSON = function(type,url){ const promise = new Promise((resolve, reject)=>{ const xhr = new XMLHttpRequest(); xhr.onreadystatechange = handler; xhr.open(type,url,true); xhr.responseType = "json"; xhr.setRequestHeader("Accept", "application/json"); xhr.send(); function handler(){ if(this.readyState !== 4){ return; } if(this.status == 200){ resolve(this.response) }else{ reject(new Error(this.statusText)) } } }); return promise; } //测试 getJSON("get","data/cartData.json") .then((response)=>{ console.log(response) }) .catch((error)=>{ console.log(error) }) getJSON是对XMLHttpRequest 对象的封装,用于发出一个针对JSON数据的HTPP请求,并且返回一个Promise对象2.3 Promise.prototype.all()方法
Promise的all用法提供并行执行异步操作,并且在所有的异步操作执行完成后执行回调。
使用场景:
一些游戏素材比较多的应用,打开网页时,预先加载需要用到的各种资源, 所有的都加载完后,我们在进行页面的初始化。all方法的实际效果是,谁跑的慢就以谁为执行回调 举例: 还是上面的三个函数runAsync1()、runAsync2()、runAsync3()。 Promise .all([runAsync1(), runAsync2(), runAsync3()]) .then((result)=>{ console.log(result) }) .catch((error)=>{ console.log(error) }) //第二个回调失败2.4 Promise.prototype.race()方法
Promise.race方法同样是将多个Promise实例,包装成一个新的Promise实例。
用法:
const p = Promise.race([p1,p2,p3]); 上面代码中,只要p1、p2、p3之中的一个实例先改变状态,p的状态就跟着改变。那个先改变的Promise实例的返回值,就传递给p的回调函数。
举例:
//加载图片超时的处理 function request(url){ let p = new Promise((resolve, reject)=>{ let img = new Image(); img.onload = resolve; img.src = url; }); return p; } //延迟函数,用于给请求计时 function timeout(){ let p = new Promise((resolve, reject)=>{ setTimeout(()=>{ reject("图片超时") },5000) }); return p; } Promise .race([requestImg("../../img/1.1.jpg"), timeout()]) .then((result)=>{ console.log(result) }) .catch((reason)=>{ console.log(reason) })
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/107348.html
摘要:最后衍生出面向各种使用场景的模块标准。定义模块返回对象的匿名模块调用模块应用由模块组成,采用模块规范。其模块功能主要由两个命令构成和。命令用于规定模块的对外接口,导出模块暴露的命令用于输入其他模块提供的功能引入其他模块。 JS诞生之初面向简单页面开发, 没有模块的概念。后来页面逐渐复杂, 人类构造到 IIFE 立即执行函数来模拟 模块;之前也有雅虎的实践,使用命名空间 作为模块名。最后...
摘要:对象解构对象解构语法在赋值语句的左侧使用了对象字面量,例如代码中,的值被存储到本地变量中,的值则存储到变量中。当使用解构赋值语句时,如果所指定的本地变量在对象中没有找到同名属性,那么该变量会被赋值为。 现在ES6在很多项目中大量使用。最近我也花时间看了一下《Understanding ECMAScript6》的中文电子书。在这里总结了一些在实际开发中常用的新特性。 块级作用域 在ES6...
摘要:在执行时会先用把配置文件转成代码再继续处理。只要你把配置文件命名成,就会用相应的去转换一遍配置文件。它没改的文件名,但配置文件和各种脚本都是完全的语法。这是提供的一个命令行工具,你可以用它代替去执行文件。总结得益于,几乎已经是现在的标配了。 概述 我最近在整理一个 Ionic + Webpack 的项目模板,因为项目代码都是 ES6 的,所以我也想在其他地方也用 ES6 。其中一个地方...
摘要:以下简称是语言的下一代标准。因为当前版本的是在年发布的,所以又称。命令用于规定模块的对外接口,命令用于输入其他模块提供的功能。需要特别注意的是,命令规定的是对外的接口,必须与模块内部的变量建立一一对应关系。 ECMAScript 6(以下简称ES6)是JavaScript语言的下一代标准。因为当前版本的ES6是在2015年发布的,所以又称ECMAScript 2015。 最常用的ES6...
阅读 855·2023-04-25 23:59
阅读 3755·2021-10-08 10:04
阅读 1690·2019-08-30 14:05
阅读 1025·2019-08-30 13:58
阅读 498·2019-08-29 18:41
阅读 1134·2019-08-29 17:15
阅读 2327·2019-08-29 14:13
阅读 2752·2019-08-29 13:27