赞
踩
var 升明
在函数作用域或全局作用域中通过关键字var声明的变量,无论实际上是在那里声明的,都会被当成在当前作用域顶部声明的变量,这就是我们常说的提升机制。
块级声明用于声明在指定块的作用域之外无法访问的变量。块级作用域(也叫词法作用域)存在于函数内部或(字符和{}之间的区域)
let声明的用法与var相同。用let代替var来声明变量,就可以把变量限制在当前的代码块中。
正常var 声明和 let声明的对比
- //var声明
- var results=true
- if(results){
- var cols='blue'
- }
- console.log(cols)//blue
- //let声明后,不在被提升到顶部,执行流离开if语句之后cols会被销毁。所以是is not defined
- var results=true
- if(results){
- let cols='blue'
- }
- console.log(cols)//cols is not defined
在同一个作用域中不能声明两个同名的变量
- //会提升results已存在
- var results=true
- let results=true
如果在当前作用域中内嵌另一个作用域,便可在内嵌的作用域中用let声明同名变量
- //这样不会出现错误提示
- var results=true
- var cols='red'
- if(results){
- let cols='blue'
- }
使用const声明的是常量,其值一段被设定不可更改。并且每个声明的常量必须要进行初始化,如果不进行会有错误提示。
- //语法错误,未初始化
- const str1;
const与let声明都是块级标识符,所以常量也只在当前代码块内有效,执行到块外会被立即销毁。常量也不会被提升到作用域顶部。另外在同一作用域中声明已经存在的变量会导致语法错误(var let都会出错)
- var results=true
- if(results){
- const cols='blue'
- }
- console.log(cols)//cols is not defined
const声明的变量不可在赋值,在赋值会导致语法错误
- const names='张三'
- names='李四'//语法错误
用const声明对象。如果是对象,对象的中的值可以修改。
- //只能修改对象的值,不能修改对象的绑定。
- const obj={
- name:'张三'
- }
- obj.name='李四'
- console.log(obj.name)//李四
如果在全局作用域下用var可以通过window调用,但是let和const则不行,它们会在全局作用域下添加一个新的绑定,但该绑定不会添加为全书对象的属性。换句话说用let或const不会覆盖全局变量。
- let l1=1
- const l2=2;
- var l3=3;
- console.log(window.l1)//undefined
- console.log(window.l2)//undefined
- console.log(window.l3)//3
总结:默认使用const,如果需要改变变量的值使用let,如果window访问或跨iframe则用var
只归纳了部分使用频率比较高的
函数中的默认参数(ES5)
- function makeRquuest(url,timeout,callback){
- timeout =(typeof timeout!=='undefined')?timeout:2000
- callback=(typeof callback!=='undefined')?callback:function(){}
- }
函数中的默认参数(ES6)
- function makeRquuest(url,timeout=200,callback=function(){}){
-
- }
不定参数
1,在函数的命名参数前添加三个点(...)就表明这是一个不定参数,该参数为一个数组,包含着自定传入之后的所有参数,通过这个数组名即可访问里面的参数。
不定参数的写法
- function funs(num,...num2){
-
- }
2,不定参数的使用限制,每个函数最多只能声明一个不定参数,而且一定要放在所有参数的最后面。不定参数不能用于对象字面段setter中
- function funs(num,...num2,num3){//直接出现错误提示
-
- }
3,不定参数对arguments的影响
不定参数代码了arguments对象。如果声明函数时使用了不定参数,则在函数被调用时,arguments对象包含了所有传入函数的参数。(不管是不是不定参数,arguments对象总是包含所有传入函数的参数)
- function funs2(...nums) {
- console.log(nums[0])//1
- console.log(nums[1])//2
- console.log(nums[2])//3
- return nums[0]+nums[1];
- }
- console.log(funs2(1,2,3))//3
箭头函数的特别
1,没有this,super,arguments和new.target绑定,是由外围最近的一层非箭头函数决定;
2,不能通过new关键字调用(箭头函数没有construct方法,所以不能用作构造函数);
3,没有原型;
4,不可以改变this的绑定;
5,不支持arguments对象;
6,不支持重复的命名参数;
箭头函数语法
写法1
只有一个参数,可以直接写参数名,箭头跟在后面
- //函数1
- let fun1=value=>value;
- console.log(fun1(2))//2
- //函数2
- let fun2=function (value) {
- return value
- }
- console.log(fun2(3))//3
- //这两个函数等价
写法2
如果需要在其中传入两个或两个以上的参数
- //函数1
- let sum1 =(num1,num2)=>num1+num2;
- console.log(sum1(1,2))//3
- //函数2
- let sum2=function(n1,n2){
- return n1+n2
- }
- console.log(sum2(1,2))//3
写法3
没有参数
- //函数1
- let sum1 =()=>'hh';
- console.log(sum1())//hh
- //函数2
- let sum2=function(){
- return 'hh';
- }
- console.log(sum2())//hh
写法3
传统函数体
- //函数1
- let sum1 =(num1,num2)=>{
- return num1+num2
- }
- console.log(sum1(1,1))//2
- //函数2
- let sum2=function(n1,n2){
- return n1+n2
- }
- console.log(sum2(1,1))//2
写法4
向外返回一个对象字面量
- //箭头函数
- let obj1=id=>({id:id,name:'张三'})
- //传统函数
- let obj2=function(id){
- return{
- id:id,
- name:'张三'
- }
- }
1,属性初始值的简写,当一个对象的属性与本地变量同名时,不必在写冒号和值,简单地只写属性名即可。如下
- //ES5的写法
- function persons(name,age){
- return{
- name:name,
- age:age
- }
- }
- //ES6简写法
- function persons(name,age){
- return{
- name,
- age
- }
- }
2,对象方法的简写消除了冒号和function关键字
- let obj={
- name:'张三',
- sayName(){
- console.log(this.name)
- }
- }
1,对象解构(就是把数据打平的一种方式)
- let node ={
- name:'张三',
- age:18,
- }
- let {name,age}=node;
- console.log(name,age);//张三,18
上面这几行代码的意思是,将node.name和node.age分别存放在name和age中
2,默认值
使用解构表达式时,如果指定的局部变量名称在对象中不存在,这个局部变量就会是undefined
注意点:当指定的属性不存在时,可以随意定义一个默认值,在属性名后面加一个等号和相应的默认值即可
- let node ={
- name:'张三',
- age:18,
- }
- let {name,age,height}=node
- console.log(name);//张三
- console.log(age);//18
- console.log(height)//undefined
-
- //当指定的属性不存在时,可以随意定义一个默认值,在属性名后面加一个等号和相应的默认值即可
-
- let node ={
- name:'张三',
- age:18,
- }
- let {name,age,height}=node
- console.log(name);//张三
- console.log(age);//18
- console.log(height)//180
3,为非同名变更赋值
如果不希望使用不同命名的局部变量来存储对象属性的值,可以使用下面的这种写法;
- let node ={
- name:'张三',
- age:18,
- }
- let {name:n1,age:a1}=node
- console.log(n1);//张三
- console.log(a1);//18
这种写法与传统的对象字面量写法相反,现在变量名在右,属性名在左
当使用变更名进行赋值时也可以添加默认值,只需要在变量名和等号后添加默认值即可
- let node ={
- name:'张三',
- age:18,
- }
- let {name:n1,age:a1,height:h1=180}=node
- console.log(n1);//张三
- console.log(a1);//18
- console.log(h1)//180
4,嵌套对象解构
解构嵌套对象与对象字面量语法一样,可以将对象拆解以获取有用的信息
- let node ={
- name:'张三',
- age:18,
- address:{
- home:'210',
- road:'金融港',
- class1:{
- name:'赵二',
- age:100
- }
- }
- }
- let {name,address:{road,class1}}=node
- console.log(name)//张三
- console.log(road)//金融港
- console.log(class1.age)//100
- console.log(class1.name)//赵二
使用非同名变量赋值(其实和上面一样)
- let node ={
- name:'张三',
- age:18,
- address:{
- home:'210',
- road:'金融港',
- class1:{
- name:'赵二',
- age:100
- }
- }
- }
- let {name:n1,address:{road:r1,class1:{name:n11,age:a22}}}=node
- console.log(n1)//张三
- console.log(r1)//金融港
- console.log(n11)//赵二
- console.log(a22)//100
1,它使用的是数组字面量,且解构操作全部在数组内完成,
- let arr1=[1,2,3,4,5,6,7,8,9,10];
- //下面这行代码的意思是将1和2分别存储在变更a1和a2中
- let [a1,a2]=arr1;
- console.log(a1)//1
- console.log(a2)//2
另一种使用方法,可以直接省略元素,为感觉兴趣的元素提供变量名如下(F2前的逗号是前方元素的点位符),可以通过这种方式取到任何想要的元素。
- let arr1=[1,2,3,4,5,6,7,8,9,10];
- //现在想要数字3
- let [,,f2]=arr1
- console.log(f2)//3
2,交换变量
- let a=1,b=2;
- [a,b]=[b,a];
- console.log(a)//2
- console.log(b)//1
3,默认值
也可以在数组解构赋值表达式中为数组中的任意位置添加默认值,当指定的值不存在或undefined时使用
- let arr2=[1,2];
- let [a1,a2,a3=3]=arr2;
- console.log(a1)//1
- console.log(a2)//2
- console.log(a3)//3
4,嵌套数组解构
在原有的数组模式中插入另个数组,深入下一层
- let arr2=[1,2,[4,5,[6,7]]];
- let [a1,a2,[a3,a4,[a5]]]=arr2
- //这里的第二个数组引用的就是4,第三个为5,依次类推
- console.log(a1)//1
- console.log(a2)//2
- console.log(a3)//4
- console.log(a4)//5
- console.log(a5)//6
5,不定元素(一般使用...语法将数组中的特定元素赋值给另一个特定的变量)
- //用法1
- let arr2=[1,2,[4,5,[6,7]]];
- let [a1,...a2]=arr2;
- console.log(a1)//1
- console.log(a2[0])//2
- console.log(a2[1])//4,5,6,7
- console.log(a2[1][0])//4
- console.log(a2[1][1])//5
- console.log(a2[1][2][0])//6
- console.log(a2[1][2][1])//7
- //用法2
- let arr3=['张三','李四','王五','赵六']
- let [b1,...b2]=arr3;
- console.log(b1)//张三
- console.log(b2[0])//李四
- console.log(b2[1])//王五
- console.log(b2[2])//赵六
不定元素语法还有另外一个功能,就是对数组实现复制类似于concat()方法所干的事
6,混合解构
- //解构一
- let arr4=[
- {
- name:'张三',
- age:22,
- height:[170]
- },
- {
- name:'李四',
- age:19
- }
-
- ]
- let [h1,h2]=arr4
- console.log(h1.name)//张三
- console.log(h1.age)//22
- console.log(h1.height)//170
- console.log(h2.age)//19
- console.log(h2.name)//李四
- //解构二
- let obj4={
- type:'1',
- name:'la',
- arr:{
- str:{
- a:1,
- b:2
- }
- },
- arr2:[1,2,3]
- }
- let {name,arr:{str},arr2:[a1,...a2]}=obj4
- console.log(name)//la
- console.log(str.a)//1
- console.log(str.b)//2
- console.log(a1)//1
- console.log(a2[0])//2
- console.log(a2[1])//3
es6中引入了第6种数据类型Symbol,Symbol的值是唯一不重复的
1,创建一个symbol
- let firstName=Symbol();
- let person={};
- person[firstName]='asdf';
- console.log(person[firstName])
注意:不能使用new Symbol会导致出错
2,Symbol接收一个可选参数,其可以让你添加一段文本描即将创建的Symbol,这段描述不可用于属性访问。方便阅读代码和调试。
- let firstName=Symbol('青青的湖水');
- let person={};
- person[firstName]='asdfghjkl';
- console.log('青青的湖水' in person)//fase
- console.log(person[firstName])//asdfghjkl
- console.log(firstName)//Symbol(青青的湖水)
3,Symbol类型检测
- let sym = Symbol("javascript");
- console.log(typeof sym)//symbol
1,set集合是一种无重复元素的列表,一般不会像访问数组那样访问每一个元素,通常的做法是检测给定的值在某个集合中是否存在。
2,map集合内含多组键值对,集合中每个元素分别存放着可访问键名和它对应的值,map集合通常被用来缓存频繁取用的数据。
1,创建set集合并添加元素使用add方法
- let set1=new Set()
- set1.add(4)
- set1.add('5')
- console.log(set1.size)//
- //添加对象
- let set2 = new Set()
- let obj1={name:"张三"}
- let obj2={name:"李四"}
- set2.add(obj1)
- set2.add(obj2)
- console.log(set2.size)//2
2,判断是否存在某个值使用has方法
- let set1=new Set()
- set1.add(4)
- set1.add('5')
- console.log(set1.has(5))//true
- console.log(set1.has(6))//false
- console.log(set1.size)//2
3,移除元素鬟delete方法
- let set1=new Set()
- set1.add(4)
- set1.add('5')
- set1.delete(5)
- console.log(set1.has(5))//false
- console.log(set1.size)//2
4,forEach方法的使用
forEach方法接受3个参数
1,set集合中下一次索引的位置
2,与第一个参数一样的值
3,被遍历的set集合本身
注意:set集合的forEach方法与数组中的forEach方法有所不同,回调函数前两个参数的值是一样的。
- let set3=new Set([1,2,3])
- set3.forEach((value,key,owner)=>{
- //value和key相同,owner是set3本身 owner等于set3
- console.log(value,key,owner)
- })
5,将set集合转化为数组(可用于数据元素去重)
- let set4 = new Set([1,2,3,4,5])
- //需要用到展开运算符(...)
- let changeArray=[...set4]
- console.log(changeArray)
6,清空set元素方法clear
- let set4 = new Set([1,2,3,4,5])
- set4.clear()
- console.log(set4)//{set:0}
1,创建map集合与获取值set和get方法
- let map=new Map()
- map.set("name","赵六")
- map.set("age","18")
- console.log(map.get("name"))//赵六
- console.log(map.get("age"))//18
在这个示例中两组键值分别被存入到了集合Map中,键名分别对应着一个字符串,然后通过get方法获取,如果键名不存在会返回undefined
2,还可以用对象做为属性的键名,如下所示
- let map2=new Map()
- let obj_1={}
- let obj_2={}
- map2.set(obj_1,1)
- map2.set(obj_2,2)
- console.log(map2.get(obj_1))//1
- console.log(map2.get(obj_2))//2
3,map集合支持的方法
1,has(key)查检指定的键名在map集合中是否已经存在
2,delete(key)从map集合中移除指定键名及其对应的值
3,clear()移除map集合中的所有键值对
4,size长度检查
- let map=new Map()
- map.set("name","赵六")
- map.set("age","18")
- console.log(map.get("name"))//赵六
- console.log(map.get("age"))//18
- console.log(map.has("name"))//true 存在键
- console.log(map.has("height"))//false 不存在
- console.log(map.size)//2 长度为2
- map.clear()//清除全部
- console.log(map.size)//0
4,map中forEach方法都接收以下三个参数
1,map集合中下一次索引的位置
2,值对应的值名
3,map集合本身
- let map2=new Map([["name","张三"],["age","18"],["height","180cm"]])
- map2.forEach((value,key,owner)=>{
- console.log(value,key)//对应的每个键值 张三 name 18 age 180cm height
- console.log(owner==map2)//owner始终和map2相等
- })
ES5中的近类结构
- function PersonTypeName(name){
- this.name=name;
- }
- PersonTypeName.prototype.sayName=function(){
- console.log(this.name)
- }
- let person = new PersonTypeName('张小飞')
- person.sayName();//张小飞
- console.log(person instanceof PersonTypeName)//true
- console.log(person instanceof Object)//true
/*详解:PersonTypeName是一个构造函数,执行后创建一个名为name的属性;并给personTypeName的原型添加一个sayName的方法,所以personTypeName对象的所有实例都共享这个方法。然后使用new操作符创建一个personTypeName的实例person,并最终证明了person对象确实是personTypeName的实例。且由于存在原型继承的特性,因而它也是object的实例.*/
类的声明
基本的类声明
- class PersonClass{
- //等价于PersonTypeName
- constructor(name) {
- this.name=name
- }
- //PersonTypeName.prototype.sayName
- sayName(){
- console.log(this.name)
- }
- }
- let Person2=new PersonClass('李小四');
- Person2.sayName();//李小四
- console.log(Person2 instanceof PersonClass);//true
- console.log(Person2 instanceof Object);//true
- console.log(typeof PersonClass);//function
- console.log(typeof PersonClass.prototype.sayName)//function
类表达式
- let PersonClass=class {
- constructor(name) {
- this.name=name
- }
- sayName(){
- console.log(this.name)
- }
- say(){
- return 'haha'
- }
- }
- let user2=new PersonClass('name')
- console.log(user2.say())//haha
- console.log(user2 instanceof PersonClass)//true
- console.log(user2 instanceof Object)//true
命名类表达式
- let PersonClass = class PersonClass2 {
- constructor(name) {
- this.name=name
- }
- sayName(){
- return this.name
- }
- }
- console.log(typeof PersonClass)//function
- console.log(typeof PersonClass2)//undefined
用类实现继承
- //类一般用来创建实例对象,里面可以定义属性和方法
- class Person{
- //构造器中的this,就是类的实例对象
- constructor(name,age) {
- this.name=name
- this.age=age
- }
- //通过Person实例调用introduce时,introduce中的this就是person的实例
- introduce(){
- console.log("我的名字是"+this.name,"年纪是"+this.age)
- }
- }
- let p = new Person("张三",18)
- console.log(p)
- p.introduce()
- //创建另一个类,继承Person类
- class Student extends Person{
- //子类中添加constructor则一定要有super,并且super一定要改在属性的前面
- constructor(name,age,height) {
- super(name,age);
- this.height=height
- }
- //重写父类introduce方法
- introduce() {
- console.log("我的名字是"+this.name,"年纪是"+this.age+"我的身高是"+this.height)
- }
- //定义子类独有的方法
- special(){
- console.log(this.height)
- }
- }
- let s1 = new Student("小赵",30,180)
- s1.special()//180
- s1.introduce()//我的名字是小赵 年纪是30我的身高是180
- console.log(s1)//返回一个实例对象
-
- let s2 = new Student("小王",40,176)
- s2.special()//176
- s2.introduce()//我的名字是小王 年纪是40我的身高是176
- console.log(s2)
以上代码定义了一个Person类和Student类,然后让Student类继承自Person类。
总结:
1,类中的构造器不是必须要写的,要对实例进行一些初始化的操作才写,比如添加指定属性
2,如果A类继承了B类,并且B类中写了构造器,那么A类构造器中的super是必须要有的,用它放父类构造器中的参数
3,类中所定义的方法,都是放在了类的原型对象上,供实例去调用
4,通过当前类去调用它里面的方法时,当前的this指向就是当前类的实例
1,Array.from()方法可以接受可迭代对象或类数组对象作为第一个参数,最终返回一个数组。
- //1,将类数组对象转换为真正的数组:
- const arrayLike = {0: 'a', 1: 'b', 2: 'c', length: 3};
- const newArray = Array.from(arrayLike);
- console.log(newArray); // ['a', 'b', 'c']
-
- //2,使用映射函数对数组进行处理:
- const numbers = [1, 2, 3, 4, 5];
- const doubledNumbers = Array.from(numbers, x => x * 2);
- console.log(doubledNumbers); // [2, 4, 6, 8, 10]
-
-
- //3,从字符串生成数组:
- const str = 'hello';
- const charArray = Array.from(str);
- console.log(charArray); // ['h', 'e', 'l', 'l', 'o']
2,find()和findIndex()这两个数组方法,用于在数组中查找满足条件的元素。
(1),find()方法的使用
- //1,查找数组中的第一个满足条件的元素:
- const numbers = [1, 2, 3, 4, 5];
- const evenNumber = numbers.find(num => num % 2 === 0);
- console.log(evenNumber); // 2
-
-
- //2,查找对象数组中符合条件的对象:
- const products = [
- { id: 1, name: 'Apple', price: 1.5 },
- { id: 2, name: 'Banana', price: 0.5 },
- { id: 3, name: 'Orange', price: 0.8 }
- ];
- const product = products.find(item => item.name === 'Banana');
- console.log(product); // { id: 2, name: 'Banana', price: 0.5 }
-
-
- //3,使用箭头函数查找指定条件的字符串:
- const fruits = ['apple', 'banana', 'orange'];
- const matchingFruit = fruits.find(fruit => fruit.startsWith('a'));
- console.log(matchingFruit); // 'apple'
-
- //4,查找字符串数组中满足条件的第一个长度大于5的字符串:
- const words = ['apple', 'banana', 'orange', 'watermelon'];
- const longWord = words.find(word => word.length > 5);
- console.log(longWord); // 'banana'
(2),findIndex()方法用法和find()相同,只是它返回的是一个索引;
(3)fill()方法可以用指定的值填充一至多个数组元素。当传入一个值时,fill方法会用这个值重写数组中的所有值。
- 1,数组元素的替换:
- let numbers=[1,2,3,4];
- console.log(numbers.fill(1))//1,1,1,1
-
- 2,将数组 arr 中从索引 2 开始的所有元素都设置为 1。
- let arr = [1, 2, 3, 4, 5];
- arr.fill(1, 2); // [1, 2, 1, 1, 1]
-
- 3,我们将数组 arr 中从索引 2 开始,到索引 4(不包括)为止的元素都设置为 1。
- let arr = [1, 2, 3, 4, 5];
- arr.fill(1, 2, 4); // [1, 2, 1, 1, 5]
(4)copyWithin()方法,用法和fill相似。
主要作用解决回调函数中嵌套回调
基本语法
new Promise(( resolve, reject ) =>{})
1,promise接受一个函数作为参数,在函数中有两个参数resolve成功函数,reject失败函数;
2,promise实例有两个属性 state状态和result结果;
3,promise有三种状态pending等待中,fulfilled成功,rejected拒绝;
4,promise状态改变
- const p = new Promise((resolve, reject) => {
- resolve("promise");
- })
- console.dir(p) // 状态为fulfilled结果为promise
-
- const p1 = new Promise((resolve, reject) => {
- resolve("promise");
- })
- console.dir(p1) // 状态为fulfilled结果为promise
5,promise中的then方法
- //成功
- const p1 = new Promise((resolve,reject)=>{
- resolve("成功")
- })
- p1.then((res)=>{
- //成功的回调 进入到res
- console.log(res)
- },(error)=>{
- //失败的回调
- console.log(error)
- })
-
- //失败
- const p2 = new Promise((resolve,reject)=>{
- resolve("失败")
- })
- p2 .then((res)=>{
- //成功的回调
- console.log(res)
- },(error)=>{
- //失败的回调 进入到error
- console.log(error)
- })
6,Promise的状态不改变,不会执行then里的方法
- // 如果Promise的状态没有改变,then里的方法不会执行
- const p = new Promise((resolve, reject) => {
-
- }).then((value) => {
- console.log("成功")
- },(reason) => {
- console.log("失败")
- })
7,通过return改变状态
- const p = new Promise((resolve,reject)=>{
- resolve()
- })
- const t = p.then((res)=>{
- console.log("成功")
- //使用reutrn可以将t实例的状态改成fulfilled
- return 'sucess'
- },(err)=>{
- console.log("失败",err)
- })
-
- t.then((res)=>{
- console.log("成功",res)
- },(err)=>{
- console.log("失败",err)
- })
8,promise的串联
- const p = new Promise((resolve,reject)=>{
- resolve('123')
- })
- p.then((value)=>{
- console.log(value)
- }).then(()=>{
- console.log("finish")
- })
- //拆解之后的写法
- let p1=new Promise((resolve,reject)=>{
- resolve("1234")
- })
- let p2=p1.then((res)=>{
- console.log(res)
- })
- p2.then((res)=>{
- console.log("finish")
- })
9,在promise链中返回promise
- let p1 = new Promise((resolve,reject)=>{
- resolve("100")
- })
- let p2 = new Promise((resolve,reject)=>{
- resolve("200")
- })
- p1.then((res)=>{
- console.log(res)
- return p2
- }).then((res)=>{
- console.log(res)
- })
- //另一处写法,等价于上面的写法
-
- let p1 = new Promise((resolve,reject)=>{
- resolve(100)
- })
- let p2 = new Promise((resolve,reject)=>{
- resolve(200)
- })
- let p3=p1.then((res)=>{
- console.log(res)
- return p2
- })
- p3.then((res)=>{
- console.log(res)
- })
当其中的某一个被拒绝
- //由于p2是reject,因此p3不会被调用,如果p1是reject都不会被调用
- let p1 = new Promise((resolve,reject)=>{
- resolve(100)
- })
- let p2 = new Promise((resolve,reject)=>{
- reject(200)
- })
- let p3=p1.then((res)=>{
- console.log(res)
- return p2
- })
- p3.then((res)=>{
- console.log(res)
- })
10,promise.all()方法
用于将多个 Promise 对象包装成一个新的 Promise 对象。它的作用是等待所有的 Promise 对象都成功(resolve),或者有一个失败(reject),然后返回一个包含所有 Promise 结果的新 Promise 对象。
- //创建了p1,p2,p3都完成之后p4才会完成
- //完成的值是一个包含1,2,3的数组
- let p1 = new Promise((resolve,reject)=>{
- resolve("1")
- })
- let p2 = new Promise((resolve,reject)=>{
- resolve("2")
- })
- let p3 = new Promise((resolve,reject)=>{
- resolve("3")
- })
- let p4=Promise.all([p1,p2,p3])
- p4.then((res)=>{
- console.log(Array.isArray(res))
- console.log(res)
- })
被拒绝的情况
- let p1 = new Promise((resolve,reject)=>{
- resolve("1")
- })
- let p2 = new Promise((resolve,reject)=>{
- reject("2")
- })
- let p3 = new Promise((resolve,reject)=>{
- resolve("3")
- })
- let p4=Promise.all([p1,p2,p3])
- p4.then((res)=>{
- console.log(Array.isArray(res))
- console.log(res)//返回拒绝值2
- })
11,Promise.all()方法。它也接受含多个受监视promise的可迭代对象作为唯一参数并返回一个promise,但只要有一个promise被解决返回的promis就被解决。不需要等到所有的Promise都被完成。一旦数组中的某个promise被完成,promise.race方法也会像promise.all方法一个返回一个特定的promise。
- //无视其它其它promise,只返回1
- let p1 = new Promise((resolve,reject)=>{
- resolve("1")
- })
- let p2 = new Promise((resolve,reject)=>{
- resolve("2")
- })
- let p3 = new Promise((resolve,reject)=>{
- resolve("3")
- })
- let p4=Promise.race([p1,p2,p3])
- p4.then((res)=>{
- console.log(Array.isArray(res))//false
- console.log(res)//返回1
- })
注:promise会解决最先完成的,如果最先完成的reject,其它的resolve就不会在执行。
12,promise中的catch方法
- const p2 = new Promise((resole,reject)=>{
- //reject("失败")
- throw new Error("出错了")
- })
- //只要有错误就会进入到catch里面来
- p2.catch(reason=>{
- console.log("失败",reason)
- })
- console.log(p2)
导入和导出(当然还有导入单个,导入多个,导入整个模块)
- //导出数据
- export let age=100;
- //导出函数
- export function all(a,b){
- return a+b
- }
-
- //导入 import from
- import { all } from "./vue";
未完待续......
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。