JavaScript ES6

let声明变量:

特性一:不能重复声明;

特性二:块级作用域(仅在let变量里边有效);(四大作用域:块级作用域、全局、函数、eval

{
let girl = '女生'
}
console.log("不能调用");

特性三:let的块级作用域中,不会影响作用域链;

{
let school='ab';
function fn(){
    console.log(school);
    }
fn();   可以使用school参数,不影响作用域链;
}

特性四:let不存在变量提升,需要先声明;

案例:点击切换颜色

let items = document。getElementsByClassName('item');
for(let i = 0;i<items.length;i++){
    items[i].onclick=function(){
        items[i].style.background = 'pink';
    }
}

:如果是var定义则会出现下标越界,因为var作用域是在整个函数中;let只在let每次的值中有效。

const声明常量

1、一定要有初始值;

2、一般常量名要大写;

3、常量的值不可以修改;

4、const也是块级作用域;

5、对于数组和对象里边属性,元素的修改不算为对此常量的修改,不报错;

ES6变量解构赋值

ES6中允许按照一定的模式用数组和对象中提取值,对变量进行赋值。

例如:数组值

const F5 = ['a','b','c'];
let[A,B,C]=F5;
console.log(A,B,C); 
输入结果为F5中对应的值,

对象值:

const zhao = {
    name:'zs',
    age:20,
    sing:function(){console.log("唱歌")}
}
let{name,age,sing} = zhao;
console.log(name);
console.log(age);
console.log(sing);
分别输出的是zhao对象中对应的值;

ES6模板字符串(` `)

let str = `模板字符串,反引号`

特性一:内容中可以直接出现换行符;

特性二:可以进行字符串拼接;

 进行字符串拼接时可以需要使用:${"变量名"}固定格式

特性三:模板字符串可以调用函数;

ES6简化对象

允许在大括号里直接写入变量和函数,作用对象的属性和方法

等效与这样写法:

 (是等效的)

 简化方法:

ES6箭头函数:("=>")

原来写法:
let fn = function(){}

箭头函数写法:

let fn =(a,b)=>{
    return a+b;
}
let result = fn(1,2);
console.log(result);

特性一:箭头函数中this是静态的,始终指向函数声明时所在作用域下的this对象。

function getName(){
    console.log(this.name);
}
let getName=()=>{
    console.log(this.name);
}
window.name = "尚硅谷";
const school = {
    name:'Atg';
}
//getName();
//getName2();
getName.call(school);
getName2.call(school);
getName()两个方法都指向window对象,
getName.call()方法改变了指向,但是箭头函数特性使其任指向window

特性二:不能作为构造函数实例化对象;

let person =(naem,age)=>{
    this.name =name;
    this.age =age;
}
let me = new person('abc',50);
console.log(me);
此程序不会执行,会报错

特性三:不能使用arguments变量

 特性四:箭头函数可以简写

 1、省略小括号(只有一个形参时)

let fn = n =>{
    return n + n;
}

2、可以省略花括号(当代码只有一条语句时)

let fn = n =>n*n;

 案例:箭头函数

传统写法:

<script>
    let ad = document.getElementById("ad");
    ad.addEventListener('click',function(){
    let that = this;
    setTimeout(function(){
        console.log(this);    指向的是that所代表的ad
        that.style.background='pink';
    },2000)

})

</script>

箭头函数写法:

根据特性,指向的任然为ad

<script>
let ad = document.getElementById('ad');
ad.addEventListener('click',function(){
    setTimeout(() =>{
    this.style.background = 'pink'
    })
})
</script>

案例2:

从数组中返回偶数元素

原来写法:

<script>
    const str = [1,3,5,7,9,10,12]
    const result = arr.filter(function(item){
        if(item %2===0){
            return true;
         }else{
            return false;
          }
    })
    console.log(result);
<script>

箭头函数写法:

const arr = [1,2,6,10,12];
const result = arr.filter(item => item%2===0);
console.log(result);

特性五:

箭头函数:适合与this无关的回调,定时器,数组的方法回调不适合与this有关的回调,时间回调,对象的方法

 ES6的参数默认值:

允许给参数赋值和初始值;

1、形参初始值,一般要给最后一个形参赋值。

function fn(a,b,c=10){
 return a+b+c;
}
let sum = fn(1,2)
console.log(sum);

2、可以与解构赋值结合

若调用函数有值则会覆盖函数中的值,若调用函数没有值,则使用函数中的默认值。

function connect({host='3.1415',username='abc'}){
    console.log(host);
    console.log(username);
}
connect({
    host:'localhost';
    username
})

ES6引入rest参数:

ES5中获取函数的实参可以使用arguments获取:输出的是对象

function data(){
    console.log(arguments);
}
data("a","b")
此时输出的是一个对象{a,b}

ES6中用rest参数替代arguments:输出的是数组

function data(...args){
    console.log(args);
}
data('a','b');
此时输出的是数组[a,b]

ES6扩展运算符:

“...”扩展运算符可以将[数组]转换为参数序列

const tf=['a','c'];
function chuwan(){
    console.log(arguments);
}
chuwan(...tf);
输出的为两个单独的对象:a,c

1、扩展运算符可以用来进行数组的合并:

普通方法:concat()方法合并;

const a =['a','b'];
const b =['c','d'];
const hebing = a.concat(b);
//concat合并的方法
console.log(hebing);
输出的结果为['a','b','c','d']

使用拓展运算符:

const a1 = ['a','b'];
const b1 = ['c','d'];
const hebing = [...a1,...b1];
console.log(hebing);
输出结果也为['a','b','c','d']

2、可以用作数组的克隆

const str = ['a','b','c']
const ab =[...str];
console.log(ab);
输出的结果为['a','b','c']

3、把伪数组转为真正数组

<div></div>
<div></div>
<script>
    const divs = document.querySelectorAll('div');
    const divArr = [...divs];
    console.log(divArr); //输入结果为[div,div]
</script>

ES6——Symbol第七种数据类型

 创建两种方式:方式一

let a = Symbol('A');
let b = Symbol('B');
console.log(a===b);
//打印输入false,此方式声明的值是唯一的

方式二:

let a = Symbol.for('aa');
let b = Symbol.for('aa');
console.log(a===b);
//返回true,这样方式值是相同的

注:Symbol不能与其他数量进行运算;

七种数据类型总结:USONB

u:underfined

s:String , Symbol

o:Object

n:null,number

b:boolean

Symbol作用:

一、创建对象属性方法:

let game={
}
let methods = {   //首先新建一个对象
    up:Symbol(),
    down:Symbol()
}

//通过这个对象添加方法
game[methods.up] = function(){
    console.log("Symbol添加方法一");
}
game[methods.down]=function(){
    console.log("添加方法二");
}

创建方法二:直接通过在目标对象通过Symbol添加方法

let youxi={
    name:'liangrensha',
    [Symbol("say")]:function(){
    console.log('方法一');
    }
}

Symbol还提供了十一个内置的值:

 ES6——迭代器(iterator)

是一种接口,为各种不同的数据结构提供统一的访问机制。

ES6提供了一个新的遍历方式for..of...

 遍历实例:

const xiyou=['唐僧','孙悟空','猪八戒','沙僧'];
for(let v of xiyou){
    console.log(v); //输出结果为:唐僧  孙悟空  猪八戒 沙僧
}

原理:

const xiyou=['唐僧','孙悟空','猪八戒','沙僧'];
let iter = xiyou[Symbol.iterator]();
console.log(iterator.next());; //输出唐僧  false  
console.log(iterator.next());;  //输出孙悟空   false
console.log(iterator.next());;//输出猪八戒   false
console.log(iterator.next());; //输出沙僧  false
console.log(iterator.next());;  //输出underfined   true

 案例:对象中遍历数组

<script>
    const banji={
    name:'一班',
    stus:[
        'xiaoming',
        'xiaotian',
        'xiaohong'
    ],
    [Symbol.iterator](){
        let index = 0;
        let _this = this;    
        return {
        next:function(){
            if(index<=_this.stus.length)
{const result ={value:_this.stus[index],done:false}};
            index++;
            return result;
            }else{
            return {value:underfined,done:true};
            }
        }
    }
    }
</script>

生成器——特殊的函数

异步编程:纯回调函数;

function * gen(){
    console.log('hello');  //调用iterator的next方法才可以调用
}
let iterator = gen();
iterator.next();

特殊点二:

function * gen(){
    console.log(111);
    yidld '调用一';
    console.log(222);
    yidld '调用二';
}
let iterator = gen();
iterator.next();

案例:生成器

<script>
    function * gen(arg){
        console.log(arg);  //输出AAA
        let one = yield 111;
        console.log(one);  //输出BBB
        let two = yield 222;
        console.log(two);  //输出CCC
        let three = yield 333;
        console.log(three);   //输出DDD
    }
let iterator = gen('AAA');
console.log(iterator.next('BBB'));
console.log(iterator.next('CCC'));
console.log(iterator.next('DDD'));
</script>

每个iterator.next函数都是前一个的调用。

生成器——异步编程(文件操作,网络操作,数据库操作)

定时器案例:

function one(){
    setTimeout(()=>{
    console.log(111);
    iterator.next();
    },1000)
}
function two(){
    setTimeout(()=>{
    console.log(222);
    iterator.next();
},2000)
}
function * gen(){
    yield one();
    yield two();
}
let iterator = gen();
iterato.next();

生成器案例:

function getUsers(){
    setTimeout(()=>{
        let data = '用户数据';
        iterator.next(data);
    }.1000)
}
function getOrders(){
    setTimeout(()=>{
        let data = '订单数据';
        iterator.next(data);
    })
}
function * gen(){
    let users = yield getUsers();
    console.log(users);
   let order = yield getUsers();
    console.log(order);
}
let iterator = gen();
iterator.next();

ES6——promise

引入的异步编程的新解决方案。promise是一个构造函数。

<script>
    const p = new Promise(function(resolve,reject){
        setTimetout(function(){
            let data = '数据库中的数据成功';
            resolve(data);
        -------------------------------
            let err = '数据读取失败';
            reject(err);
        },1000);
});
//调用promise对象的then方法
    p.then(function(value){
        console.log(value);
},function(reason){
    console.error(reason);
})
</script>

当获取成功时获取resolve参数,执行then方法第一个回调;

当获取失败时获取reject参数,执行then方法第二个回调;

promise实例读取文件(node.js获取fs模块):

let fs = requie('fs');
//引入node的fs模块

const p = new Promise(function(resolve,reject){
    fs.readFile('./files/1.txt',(err,reject)=>{
    if(err) reject(err);
    resolve(data);
    });
});
p.then(function(value){
    console.log(value.toString());
},
function(error){
    console.log("获取失败");
})

使用promise封装AJAX

<script>
    const p = new Promise((resolve,reject)=>{
        const xhr =new XMLHttpRequest();
        xhr.open("GET","https://api.apiopen.top/get");
        xhr.send();
        xhr.onreadystatechange = function(){
        if(xhr.readyState ===4){
            if(xhr.status >= 200 && xhr.status <300){
            resolve(xhr.response);
            }else{
            reject(xhr.status);
            }        
         }
    }
})
p.then(function(value){
    console.log(value);
},
function(error){
    console.log(error);
}
)
</script>

promise-then方法:

<script>
    const p = new Promise((resolve,reject)=>{
    setTimeout(()=>{
        resolve('执行成功');
    -----------------------
       reject('执行失败');
    },1000)
});
const result = p.then(value=>{
    console.log(value);
},function(error){
    console.warn(reason);    向控制台输出一个警告信息
})
console.log(result);
</script>

调用then方法,它的返回结果是Promise对象,对象的状态由回调函数的执行结果决定

如果回调函数中的返回的结果是非Promise类型的属性,状态为成功,返回值是对象成功的值

实例:返回值不是Promise类型的

<script>
    const p = new Promise((resolve,reject)=>{
    setTimeout(()=>{
    执行成功
        resolve('用户数据');  
-------------------------
    执行失败
        reject('出错啦');
     },1000)
    });
    const result = p.then(value =>{
        console.log(value);
        return '不是promise类型'
    },reason=>{
        console.warn(reason);
        });
     console.log(result);
</script>

实例:返回值是Promise类型的

此时内部return 返回的promise状态决定了then方法返回的Promise状态。

const p = new Promist((resolve,reject)=>{
    setTimeout(()=>{
        resolve('数据执行成功');
        --------------------
        reject('数据执行失败');
    }.1000)
});
const result = p.then(value=>{
    console.log(value);
    return new Promise((resolve,reject)=>{
        resovle('成功');
--------------------------------
        reject('error');
    })
})

then方法还可以抛出错误

const p = new Promist((resolve,reject)=>{
    setTimeout(()=>{
        resolve('数据执行成功');
        --------------------
        reject('数据执行失败');
    }.1000)
});
const result = p.then(value=>{
    console.log(value);
    throw new Error('出错啦')
},reason=>{ 
        console.warn(reason);
    })
})

案例:读取多个文件(链式调用)

const fs = require('fs');
const p = new Promise((resolve,reject)=>{
    fs.readFile('./flies/1.txt',(err,data)=>{
    resolve(data);
    });
});
p.then(value=>{
    return new Promise((resolve,reject)=>{
        fs.readFile('./file/2.txt',(err,data)=>{
            resolve([value,data]);
        });
    })
}).then(value=>{
    return new Promist((resolve,reject)=>{
        fs.readFile('./file/3.txt',(err,data)=>{
            value.push(data);
            resolve(value);
        });
    })
}).then(value=>{
    console.log(value.join('\r\n'));
})

ES6中Promise——catch方法

<script>
    const p = new Promise((resolve,reject)=>{
    setTimeout(()=>{
    reject('出错了');
    },1000)
    });
    p.then(function(value){},function(reason){  
        不指定一个成功参数,直接第二个参数
        console.log(reason);
    });
------------------------------
    
    p.catch(function(reason){
        console.warn(reason);
    })
</script>

set集合介绍与API

声明一个set集合:set声明的集合中的元素只能是唯一的

<script>
    let s = new set();
</script>

 声明一个set集合,并统计个数:"集合名".size;

<script>
    let s2 = new Set(['学习','游泳','读书','学习','学习']);
    元素个数
    console.log(s2.size);
</script>

添加新元素:集合名.add('元素名');

<script>
    let s = new Set(['学习','游泳','读书','学习','学习']);
    s.add('写代码');
</script>

删除元素:集合名称.delete('元素名称');

<script>
    let s = new Set(['学习','游泳','读书','学习','学习']);
    s.delete('游泳');
</script>

检测元素是否存在:集合名称.has('元素名称');

<script>
    let s = new Set(['学习','游泳','读书','学习','学习']);
    s.has('学习');
    存在返回true
    不存在返回false
</script>

 清空集合:集合名称.clear();

<script>
    let s = new Set(['学习','游泳','读书','学习','学习']);
    s.clear();
</script>

set集合实践:

数组去重:转化为集合,利用其特性,元素唯一性。

<script>
    let arr=[11,2,3,10,15,15];;
   set生成的集合,其中的元素只能是唯一的
    let result = [...new Set(arr)];
    console.log(result);
</script>

两个数组取交集:

filter():创建一个新数组;

let arr = [1,2,2,3,5,5];
let arr2 = [5,6,5];
let result = [...new Set(arr)].filter(item=>{
    let s2 = new Set(arr2); //5,6
    if(s2.has(item)){
        return true;
    }else{
        return false;
    }
});
console.log(result);
---------------------方法二
let result =[...new Set(arr)].filter(item=>new Set(arr2).has(item));

两个数组取并集:

<script>
let arr = [1,2,2,3,5,5];
let arr2 = [5,6,5];
let hebing = [...new Set([...arr,...arr2])];
console.log(hebing);
</script>

两个数组取差值:

<script>
let arr = [1,2,2,3,5,5];
let arr2 = [5,6,5];
let result = [...new Set(arr).filter(item=>{
    let s2 = [...new Set(arr2)];
    if(s2.has(item)){
        return false;
    }else{
        return true;
    }
    })]
</script>

ES6——Map数据结构

Map数据结构类似于对象,也是键值对的集合。但‘键’范围不限于字符串,各种类型的值(包括对象)都可以当做键。Map也实现了iterator接口,所以可以使用【扩展运算符】和【for....of...】进行遍历。

1、size 返回Map元素个数;

2、set 增加一个新元素,返回当前Map;

3、get 获取键名对象的键值;

4、has 检测Map中是否包含某个元素,返回boolean值;

5、clear清空集合,返回underfined;

6、delete 删除键名或值

一、创建一个空Map

let m = new Map();

二、添加元素

<script>
let m = new Map();
m.set('name','尚硅谷');
m.set('change',function(){
    console.log('我们可以改变你!');
});
</script>

 三、删除元素:

<script>
let m = new Map();
m.set('name','尚硅谷');
m.set('change',function(){
    console.log('我们可以改变你!');
});
//删除指定的值
m.delete('name');
</script>

 四、获取元素

<script>
let m = new Map();
m.set('name','尚硅谷');
m.set('change',function(){
    console.log('我们可以改变你!');
});
//获取键名对象的值
console.log(m.get(change));
</script>

五、清空

<script>
let m = new Map();
m.set('name','尚硅谷');
m.set('change',function(){
    console.log('我们可以改变你!');
});
let key ={
    school:'ATGUI'
}
m.set(key,['ab','cd','ef']);

m.clear();
</script>

六、遍历

<script>
let m = new Map();
m.set('name','尚硅谷');
m.set('change',function(){
    console.log('我们可以改变你!');
});
let key ={
    school:'ATGUI'
}
m.set(key,['ab','cd','ef']);

for(let v of m){
    console.log(v);

}
</script>

class类

知识点:

1、class声明类;2、constructor定义构造函数初始化;

3、extends继承父类;   4、super调用父级构造方法 ;

5、static定义静态方法和属性;   6、父类方法可以重写;

ES5通过构造函数实例化对象方法:

<script>
    function phone(brand,price){
        this.brand = brand;
        this.price = price;
    }
    phone.prototype.call = function(){
        console.log('可以打电话');
    }
    let huawei = new phone('华为',4500);
    huawei.call();
    console.log(huawei);

</script>

ES6通过class构造方法:

constructor方法当实例化(new)时,自动调用此方法;固定方式;

方法必须使用此方式定义;

class shouji{
    constructor(brand,price){
        this.brand = brand;
        this.price = price;
    }
    call(){
        console.log('我可以打电话');
    }
}
    let onePlus = new shouji('oppo',2999);
    console.log(shouji);

class类的静态成员:

静态属性只能class类调用

<script>
class phone{
    static name = '手机';
    static change(){
        console.log('方法');
    }
}
let nokia = new phone();
console.log(phone.name);
</script>

ES5构造函数的继承:

<script>
    function phone(){
        this.brand = brand;
        this.price = price;
    }
    phone.prototype.call= function(){
        console.log("我可以打电话");
    }
    function smartPhone(brand,price,color,size){
        phone.call(this,brand,price);
        this.color =color;
        this.size = size;
    }
//设置子级构造函数的原型
    smartPhone.prototype = new phone;

//声明子类的方法
    smartPhone.prototype.phone = function(){
        console.log('拍照');
    }
    smartPhone.prototype.playGame = function(){
        console.log('游戏');
    }
    const chuizi = new smartPhone('锤子',2499,'黑色',5.5inch);
    console.log(chuizi);
</script>

类继承:

class Phone{
    constructor(){
        this.brand = brand;
        this.price = price;
    }
    call(){
        console.log("我可以打电话");
    }
}
   class smartPhone extends Phone {
    //构造方法
    constructor(brand,price,color){
         super(brand,price); //子类访问父类方法属性
        this.color= color;
    }
    photo(){
        console.log('拍照');
     }
    playGame(){
        console.log('玩游戏');
    }
}
const xiaomi = new smartPhone('小米',1999,'黑色');
    console.log(xiaomi);
    

(当子类有与父类同名的方法时,只能调用子类的方法,进行完全重写;)

class中的get和set:

<script>
    class phone{
        get price(){
        console.log("价格属性被读取了");
        return 'iloveyou';
        }
        set price(newVal){
            console.log("价格属性被修改了");
        }
    }
    let s = new phone();
//设置数据
    s.price = 'free';
----------------------------
//读取数据
    console.log(s.price);
</script>

ES6数值的扩展

一、Number.EPSILON是JavaScript表示最小精度;

EPSILON属性的值接近于2.22044....E-16,如果两个值相减值小于EPSILON则表示两个值为相等的;

<script>
    function equal(a,b){
    if(Math.abs(a-b) < Number.EPSILON){
        return true;
    }else{
        return false;
   }
}
console.log(0.1+0.2 ===0.3);  //返回值为false
console.log(equal(0.1+0.2,0.3));  //返回值为:true

</script>

二、二进制,八进制,十进制,十六进制

Number.isFinite检测是否为一个有限数;

console.log(Number.isFinite(100));
返回true;
console.log(Number.isFinite(Infinity));
返回为false

四、Number.isNaN检测一个数值是否为NaN

五、Number.parseInt / Number.parseFloat字符串转整数/浮点数

六、Number.isInteger判断一个数是否为整数

七、Math.trunc将数字的小数部分抹掉

八、Math.sign判断一个数是正数、负数还是0;

正数返回1,负数为-1,零返回0;

ES6对象方法的扩展:

1、Object.is判断两个值是否完全相等

console.log(Object.is(120,120)); //返回值为true

2、Object.assign对象的合并

合并时,后边的会覆盖掉前边的重名属性。

<script>
    const config1 ={
      host:'agbsdf',
      port:3306,
      name:'aaa'
    };
    const config2={
        host:'123',
        port:222,
        name:'张三'
    }
    console.log(Object.assign(config1,config2));

</script>

3、Object.setPrototypeof 设置原型对象

      Object.getPrototypeof 获取原型对象

<script>
    const school = {
        name:'尚硅谷'
    }
    const cities = {
        xiaoqu:['北京','上海','深圳']
    }
    Object.setPrototypeof(school,cities);
    console.log(Object.getPrototypeof(school)); //输出的是获取的属性
    console.log(school);
</script>

ES6模块化

优势:

1、防止命名冲突;

2、代码复用;

3、高维护性;

ES6之前模块化规范产品:

  ES6模块化语法

模块功能主要由两个命令构成:exportimport

export命令用于规定模块的对外接口

import命令用于输入其他模块提供的功能

<body>
    <script type='module'>
导入模块通用方式
        import * as m1 from "./src/js/1.js";
        console.log(m1);
    </script>
</body>

 (分别暴露):

export let school = "尚硅谷";
export function teach(){
    console.log("我们可以教给你技能");
    }

(统一暴露):

let school = '尚硅谷';
function findJob(){
    console.log("学习更多知识");
}
export{school,findJob};

 (默认暴露):

export default{
    school:'abc',
    change:function(){
        console.log("我们可以教你");
    }
}

导入模块方法二:解构赋值形式

分别暴露方法:

<script><
    import {school,teach} from "./src/js.1.js";
    console.log(school);
    console.log(teach);
/script>

 统一暴露方法:

<script>
    import {shcool as guigu,findJob} from "./src/1.js";
    console.log(guigu,findJob);
</script>

默认暴露法:

<script>
    import {default as m3} from "./src/m3.js";
    console.log(m3);
</script>

简便形式——只能针对默认暴露

<script>
    import m3 form "./src/m3.js";
    console.log(m3);
</script>

ES6模块化另一个种方式:

声明模块化

<body>
<script src='./src/js/app.js' type ='module'></script>

</body>

 导入模块化文件(通用方法,分别暴露法,统一暴露法,默认暴露法)

import * as m1 from "./m1.js";
console.log(m1);

通过babel对ES6模块化进行转化:

模块化引入NPM包:

ES7新特性

一、Array.prototype.includes

includes()方法用来检测数组中是否包含某个元素,返回布尔型值。

<script>
    const mingzhu = ['西游记','红楼梦','水浒传']
    console.log(mingzhu.includes('西游记'));
    //若存在值则返回true;
    //若不存在则返回false;
</script>

二、指数操作符(**)两个星号。

<script>
    console.log(2**10);    //1024
    console.log(Math.pow(2,10)); //1024
</script>

ES8新特性

async函数和await表达式两种语法结合可以让异步代码像同步代码一样。

一、async函数

1、函数的返回值是promise对象;

2、promise对象的结果由async函数执行的返回值决定;

返回的是一个非promise对象时,返回的就是一个成功的Promise值

<script>
    async function fn(){
            返回一个字符串
        return '尚硅谷';
---------------------------
        return;
------------------------
        throw new Error('出错了');
}
</script>

----------------------------------------------------------------------

 当返回的结果是Promise时:

 返回的状态由函数内部的return语句决定;

<script>
    async function fn(){
        return new Promise((resolve,reject)=>{
          resolve('成功的数据');
          --------------------
          reject('失败的数据');
        });
    }
    const result = fn();
    console.log(result);
调用then方法:
result.then(value=>{     成功时调用第一个
    console.log(value);
},reason=>{
    console.warn(reason);  失败时调用这个
})
</script>

 抛出错误时,返回是一个失败的Promise:

 

 await表达式

 1、await必须写在async函数中;

2、await右侧表达式一般为Promise对象

3、await返回的是Promise;

4、await的Promise失败了,就会抛出异常,需要通过try ...catch捕获处理

执行成功时:

<script>
    const p = new Promise((resolve,reject)=>{
        resolve("成功返回用户数据");
})
    async function main(){
    let result = await p;
    console.log(result);
    }
</script>

执行失败:

const p = new Promise((resolve,reject)=>{
    reject("失败数据");
})
async function main(){
    try{
        let result = await p;
    }catch(e){
        console.log(e);
    }
}

  ES6——async和await结合读取内容

const fs = require('fs');
function readWeixue(){
    return new Promise((resolve,reject)=>{
        fs.readFile('./文件/为学.md',(err,data)=>{
             if(err) reject(err);
             resolve(data);
        })
    })
}
function readGuan(){
    return new Promise((resolve,reject)=>{
        fs.readFile('./文件/观书有感.md',(err,data)=>{
             if(err) reject(err);
             resolve(data);
        })
    })
}
async function main(){
    let weixue = await readWeixue();
    let guan = await readGuan;
    console.log(weixue.toString);
    console.log(Guan.toString);
}
main();

  ES6——async和await结合封装AJAX请求

function sendAJAX(url){
    const x = new XMLHttpRequest();
    return new Promise((resolve,reject)={)
    x.open();
    x.send();
    x.onreadystatechange = function(){
        if(x.readyState===4){
             if(x.status>=200 && x.status<=300){
                resolve(x.response);
             }else{
              reject(x.status);
            }
        }
    }
  })
}
------------------------
promise中then方法测试
sendAJAX("https://www......").then(value=>{
    console.log(value);
},reason=>{
    
})
---------------------------
async function main(){
    let result = await sendAJAX("https://www......");
    console.log)(result);
}
main();

 Object.values和Object.entries:

 Object.values()方法返回一个给定对象的所有可枚举属性值的数组;

<script>
    const school = {
        name:'尚硅谷',
        cities:['北京','上海','深圳'],
        xueke:['java','前端','大数据']
    };
    //获取所有对象的键:
   console.log(Object.keys(school));
    //输出所有的值:
   console.log(Object.values(school));

</script>

Object.entries()方法返回的是一个给定对象自身可遍历属性[ key,value]的数组;

<script>
    const school = {
        name:'尚硅谷',
        cities:['北京','上海','深圳'],
        xueke:['java','前端','大数据']
    };
    //获取[key,value]数值
    console.log(Object.entries(school));
    
</script>

 Object.entries()方法有利于创建Map:

<script>
    const school = {
        name:'尚硅谷',
        cities:['北京','上海','深圳'],
        xueke:['java','前端','大数据']
    };
    const m = new Map(Object.entries(school));
    console.log(m);
    console.log(m.get('name'));  //输出"尚硅谷"
</script> 

 Object.getOwnPropertyDescriptors()返回指定对象所有自身属性的描述对象

<script>
    const school = {
        name:'尚硅谷',
        cities:['北京','上海','深圳'],
        xueke:['java','前端','大数据']
    };
    console.log(Object.getOwnPropertyDescriptors(school));
</script> 

 ES9扩展运算符和rest参数

一、扩展运算符

在函数参数中时,会将其余参数都放入到扩展运算符中

<script>
    function connect(host,port,...user){
       console.log(host);
       console.log(port);
       console.log(user); 
    }
    connect({
        host:'3.1415',
        port:123,
        username:'zs',
        password:123456
    })

<script>

 扩展运算符在对象中:

<script>
    const skillOne = {
        q:'技能一'
    }
    const skillTwo = {
        w:'技能二'
    }
    const mangseeng = {...skillOne,...skillTwo};
    console.log(mangseng);

</script>

 输出结果为:

ES9正则扩展——命名捕获分组

捕获:

<script>
    let str = '<a href="http://www.baidu.com">百度</a>';
    const reg = /<a href="(.*)">(.*)</a>;
    const result = reg.exec(str);
    console.log(result);
</script>

输出结果为: 

捕获分组:

在需要提取前边加上:?<"命名">

<script>
    let str = '<a href="http://www.baidu.com">百度</a>';
    const reg = /<a href="(?<url>.*)">(?<text>.*)</a>/
    const result = reg.exec(str);
    console.log(result);
</script>

执行结果:

 ES9正则表达式——正则断言

<script>
    let str = 'js123正则断言666啦啦啦';
    const reg = /\d+(?=啦)/;
     //   \d是正则数字简写(0-9)
    const result = reg.exec(str);
    console.log(result);
</script>

 ES9正则表达式——反向断言:

<script>
    let str = 'ying123中文111zhongwen';
    const reg = /(?<=zhong)\d+/;
    const result = reg.exec(str);
    console.log(result);
</script>

ES9正则扩展——dotAll模式:

dot——"."(英文点)

<script>
  let str = '<ul>
            <li>
                <a>名称</a>
                <p>日期</p>
            </li>
        </ul>';
const reg = /<li>.*?<a>(.*?)<\/a>.*?<p>(.*?)<\/p>/gs;
let result;
let data=[];
while(result= reg.exec(str)){
    console.log()result;
    data.push({title:result[1],time:result[2]});
}
console.log(data);
</script>

ES10新特性——Object.formEntries

 将二维数组转换为对象

<script>
const result = Object.fromEntries([
    ['name','尚硅谷'],
    ['kemu','java']
]),
console.log(result);
</script>

将对象转化为二维数组(ES8新特性)与ES10这个特性互逆的

<script>
    const arr = Object.entries({
    name:'尚硅谷'
})
    console.log(arr);
</script>

ES10新特性——trimStart(清空字符串左侧空白)和trimEnd(清空字符串右侧空白:

<script>
    let str = '   asadf   ';
    console.log(str);
    console.log(str.trimStart());
    console.log(str.trimEnd);
</script>

ES10新特性——flat和flatMap:

flat默认为深度1,降低一个维,三维变二维:

<script>
    const arr = [1,2,3[4,5[6,7]]];
    console.log(arr.flat());
</script>

输出结果为: 

flat设置为一维数组:

<script>
    const arr=[1,2,3[4,5[6,7]]];
    console.log(arr.falt(2));
</script>

输出结果为:

 flatMap:把Map结果变为一维数组:

<script>
    const arr=[1,2,3[4,5[6,7]]];
    const result = arr.flatMap(item=>[item * 10]);
    console.log(result);
</script>

 ES10新特性——Symbol.prototype.description

<script>
    let s = Symbol("尚硅谷");
    console.log(s.description);
</script>

ES11新特性

私有属性:只能在class类中使用

<script>
class Person{
    name,
    #age,
    #weight;
    constructor(name,age,weight){
        this.name = name;
        this.age = age;
        this.weight = weight;
    }
    intro(){
        console.log(this.name);
        console.log(this.age);
        console.log(this.weight);
    }
}
 const gril = new Person('小红',20,'50kg');   
    gril.intro();
</script>

ES11新特性——Promise.allSettled

 接收一个Promise数组,返回的也是一个Promise对象,返回的一直是成功的状态;

<script>
    const p1 = new Promise((resolve,reject)=>{
        setTimeout(()=>{
            resolve("商品数据");
        },1000)
    });
    const p2 = new Promise((resolve,reject)=>{
        setTimeout(()=>{
            resolve("价钱信息");
        },1000)
    });
    const result = Promise.allSettled([p1,p2]);
    console.log(result);
</script>

返回的数据为:

其中一个为执行失败时,执行结果还是成功状态返回:

 与此特性类似的是Promise.all()方法:

只有当全部为成功属性才返回成功Promise状态,否则返回失败状态Promise;

<script>
    const p1 = new Promise((resolve,reject)=>{
        setTimeout(()=>{
            resolve("商品数据");
        },1000)
    });
    const p2 = new Promise((resolve,reject)=>{
        setTimeout(()=>{
            resolve("价钱信息");
        },1000)
    });
    const re = Promise.all([p1,p2]);
    console.log(re);
</script>

 ES11新特性——String.prototype.matchAll()

返回的是数据匹配正则的批量方法:

<script>
    let str='<ul>
        <li>
            <a>肖生克救赎</a>
            <p>上映日期</p>
        </li>
        <li>
            <a>肖生克救赎</a>
            <p>上映日期</p>
        </li>
    </ul>';
    const reg = /<li>.*?<a>(.*?)<\/a>.*?<p>(.*?)<\/p>/sg;
    const result = str.matchAll(reg);
    for(let v of result){
        console.log(v);
        返回的是数据
    }
--------------------------------
    利用扩展运算符展开
    const arr = [...result];
    console.log(arr);
</script>

ES11——可选链操作符( ?. )

用在对象类型的参数是,可以使用这个操作符,

不用操作符时:

<script>
    function main(config){
    const dbhost = config && config.db && config.db.host;
}
    main({
    db:{
        host:'192.168.1.1'
        username:'root'
    },
    cache:{
        host:'123'
        name:'abc'
    }
})
    
</script>

用可选操作符时:

<script>
    function main(config){
        const dbhost= config?.db?.host;
        console.log(dbhost);
    }
    main({
        db:{
          host:'1921.168.1.1',
          username:'root'    
        },
        cache:{
            host:'192.168.1.1',
            username:'admin';
            }
    })
</script>

返回值为:

 若没有参数时,输出:underfined

  

<script>


</script>

ES11——大整型(bigInt

<script>
    let n = 521n;
    console.log(n,typeof(n));
</script>

定义函数转化为大整型:(不能是浮点数)

<script>
    let n = 123;
    console.log(BigInt(n));
</script>

大数值运算:

<script>
    let max = Number.MAX_SAFE_INTEGER;
    console.log(max); 
</script>

输出结果为: 

<script>
    let max = Number.MAX_SAFE_INTEGER;
    console.log(max+1);
    console.log(max+2);
</script>

最大只能输出这个值;

 可以使用BigInt进行转化获得更大数值,进行相加时需要都加上转化BigInt

<script>
    let max = Number.MAX_SAFE_INTEGER;
    console.log(BigInt(max)+BigInt(1));
    console.log(BigInt(max)+BigInt(2));
</script>

 ES11新特性——绝对全局对象globalThis

<script>
    console.log(globalThis);
</script>

指向window对象

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值