ES6-ES11语法学习

一、ES6新特性

1.let

不可重复声明
自带块级作用域,块级外访问不到块级内的
不存在变量提升
不影响作用域链

2.const

常量:值不能修改的量
一定要赋初始值
一般常量使用大写(潜规则)
常量的值不能修改
自带块级作用域
对于数组和对象的元素的修改,不算对常量的修改,不会报错(地址不变)

3.解构赋值

3.1数组的解构

const  F4 = ['小沈阳','刘能','赵四','宋小宝']
let [xiao,liu,zhao,song] = F4

3.2对象的解构

const zhao = {
      name:'赵本山',
      age:'不详',
      xiaopin:function(){
          console.log('我可以演小品')
       }
};
let {name,age,xiaopin} = zhao
let {xiaopin} = zhao

4.模板字符串 两个`

内容中可以直接出现换行符

let str = `<ul>
                  <li>沈腾</li>
                  <li>玛丽</li>
                  <li>魏翔</li>
                  <li>艾伦</li>
            </ul>`;

变量拼接

let lovest = '魏翔'
let out = `${lovest}是我心中最搞笑的演员!`
//输出 魏翔是我心中最搞笑的演员

5.简化对象写法

let name = '学前端'
let change = function(){
       console.log('可以改变你的人生')
    }
const school = {
        name,//名字一样可以直接简写成这样
        change,
        improve(){
        }//方法也进行简写了
  }

6.箭头函数 =>

原函数:
let fn = function(){}
箭头函数:
let fn = ()=>{}

声明的区别:
箭头函数的this是静态的,始终指向函数声明时所在作用域下的this的值

不能作为构造函数去实例化对象
不能使用arguments变量

简写:
6.1省略(),当形参有且只有一个的时候
6.2.省略{},当代码体只有一条语句的时候

箭头函数的使用情况:
适合于this无关的回调,如定时器、数组的方法的回调;不适合和与this有关的问题,如事件回调,对象的方法

7.函数参数的初始赋值

7.1形参初始值 具有默认值的参数,一般位置比较靠后

function add(a,b,c = 10){
          return a+b+c
   }
let result = add(1,2) 
//输出为13

7.2可以与解构赋值结合使用

function connect({host,username,password,port}){
//可以直接输出对应的字段名
}
connect({
     host:'localhost',
     username:'root',
     password:'root',
     port:3306
})
     

8.rest参数

function date(...args){
     console.log(args)
}
date('阿娇‘’,'白芷','四惠')
//可直接输出

注意:必须要放在最后

9.扩展运算符 …

能将数组转化为逗号分割的参数序列

const tfboys = ['易烊千玺','王源','王俊凯']
function chunwan(){
}
chunwan(...tfboys)

10.symbol

值是唯一的,用来解决命名冲突的问题
不能与其他数据进行运算
定义的对象属性不能使用for…in循环遍历,但是可以使用Reflect.ownKeys来获取对象的所有键名

11.迭代器iterator

for of 键名
for in 键值

实现自定义的遍历数组:

const classBJ = {
   name:'终极一班',
   stus:[
         'xiaoming',
         'xiaoning',
         'xiaotian',
         'knight'
   ],
   [Symbol.iterator](){
         let index = 0;
         //声明一个变量保存
         let _this = this
         return {
                 next:function(){
                 if(inde<_this.stus.length){
                         const result = {value:_this.stus[index],done:false}
                         index++;      
                         return result;           
                      }else{
                         return{value:undefined,done:true}
                      }
                }
         }
   }
      for(let v of classBJ){
           console.log(v)
      }
   
}

12.生成器函数(特殊函数,异步编程纯回调函数)

function * gen(){
//yield是代码的分割符
      yield '一只没有耳朵';
      yield '一只没有尾巴';
      yield '真奇怪'
    }
      let iterator = gen()
      iterator.next()//调用一次,往下执行一段
      iterator.next(‘ADC’)//会根据传参进行执行,覆盖之前的

13.promise

是一个构造函数,用来封装异步操作并可以获取其成功或失败的结果。

const p = new Promise(function(resolve,reject){
        setTimeout(function(){
             let data = '数据库中的用户数据';
             resolve(data)
             let err = '数据读取失败';
             reject(err);
        },1000);
});
  p.then(function(value){
         console.log(value);
    },function(reason){
         console.error(reason)
    })

13.1 then:可以链式调用(解决回调地狱)

p.then(value=>{},reason=>{}).then(value=>{},reason=>{})

promise对象
可以抛出错误
13.2 catch

p.catch(function(reason){
     console.warn(reason)
})

14.set

自动去重

let s = new Set()

个数:size
增加:add(元素)
删除:delete(元素)
判断是否有:has(元素)
清空:clear()

15.map

let m = new Map()

添加:set(key,value)
个数:size
删除:delete(key)
获取:get(key)
清空:clear()
遍历:for(let v of m){}

16.class

calss Phone{
   constructor(brand,price){
      this.brand = brand
      this.price = price
   }
   call(){
     console.log("我可以打电话")
   }
}
let onePlus = new ("1+",1999)
//输出类onePlus

get 和set

class Phone{
    get price(){
         console.log("价格属性被读取了")
         return 'i love you'
    }
    set price(newVal){
         console.log("价格属性被修改了")
    }
}
let s = new Phone();
s.price = 'free'

17.extend继承

calss Phone{
   constructor(brand,price){
      this.brand = brand
      this.price = price
   }
     call(){
     console.log("我可以打电话")
   }
 }
 class SmartPhone extends Phone{
          constructor(brand,price,color,size){
              super(brand,price)
              this.color = color
              this.size = size
          }
         photo(){
              console.log('拍照')
         }
         playGame(){
             console.log('玩游戏')
         }
 }
 const xiaomi = new SmartPhone('小米',799,'黑色','4.7inch')
 //输出小米,所有的属性和方法都有

若出现重写,遵循子类修改后的数据一致

18.数值扩展

18.1 EPSILON表示最小精度

Math.abs(a-b)<Number.EPSILION

成立就是默认a==b

isFinite 判断一个数值是否为有限数
isNaN 检测一个数值是否为NaN
parseInt和parseFloat字符串转整数
isInterger 判断一个数是否为整数
trunc 将数字的小数部分抹掉
sign 判断一个数是正数、负数还是0(-1,0,1)
Object.is 判断两个值是否完全相等(但是NaN相等)
Object.assign 对象的合并(属性相同的话,后面会把前面的覆盖)
Object.setPrototypeof 设置原型对象
Object.getPrototypeof 获取原型对象

19.模块化

export用于规定模块的对外接口
import用于输入其他模块提供的功能

二、ES7新特性

1.includes

判断数组是否存在这个元素 arr.includes(元素)

2.**幂运算

2**10
Math.pow(2,10)

三、ES8新特性

async和await让异步代码像同步代码一样

1.async

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

返回的结果:
不是一个promise对象:成功的promise对象
抛出错误:失败的promise
是一个promise对象:决定函数返回的是什么,返回失败就是失败,成功就是成功

2.await

必须写在async函数中
右侧的表达式一般为promise对象
返回的是promise成功的值
如果promise失败,就会抛出异常,需要通过try…catch捕获处理

结合发送ajax请求

function sendAJAX(url){
   return new Promise(resolve,reject)=>{
      const x = new XMLHttpRequest();
      x.open('GET',url);
      x.send();
      x.onreadystatechange = function(){
          if(x.readyState === 4){
               if(x.status >=200&&x.status<300){
                   resolve(x.response);
               }else{
                   reject(x.status);
               }
          }
      }
   } 
}
//重点!
async function main(){
    let result = await sendAJAX("接口地址")
}

Object.values和Object.entries

3.Object.values

返回一个给定对象的所有可枚举属性值的数组
//获取对象的所有的键

Object.keys()

4.Object.entries

返回一个给定对象自身可遍历属性[key,value]的数组
方便创建一个map

const m = new Map(Object.entries(obj))

//对象属性的描述对象

Object.getOwnPropertyDescriptors(obj)

四、ES9的新特性

1.为对象提供了像数组一样的rest参数和扩展运算符

function connect({host,port,..user}){
   //除了host和port,后面所有的属性都存在了user里
}
connect({
      host:'127.0.0.1',
      port:3306,
      username:'root',
      password:'root',
      type:'master'
})

2.正则命名捕获分组

let str = '<a herf = "http://www.atguigu.com">尚硅谷</a>';
const reg = /<a herf = "(?<url>.*)">(?<text>.*)<\/a>/;
const result = reg.exec(str)
console.log(result)
//可通过result.group.url和result.group.text去获取对应的url和内容

3.dotAll模式

在后面加了s之后,.可以匹配任意字符,换行也可以匹配

let str = `
<ul>
      <li>
            <a>肖申克的救赎</a>
            <p>上映时间:1994-09-10</p>
      </li>
      <li>
             <a>阿甘正传</a>
             <p>上映时间:1994-07-06</p>
      </li>
<ul>`;
const reg = /<li>.*?<a>(.*?)<\/a>.*?<p>(.*?)<\/p>/s;
const result = reg.exec(str);

五、ES10的新特性

1.Object.formEntries

接收二维数组或者map,将其转化为对象

const result = Object.formEntries([
         ['name','尚硅谷'],
         ['xueke','Java,大数据,前端,云计算']
]);
const m = new Map();
m.set('name','ATGUIGU');
const result = Object.formEntries(m)

2.trimStart与trimEnd

清除左侧空格和右侧空格

3.flat与flatMap

flat(n):将高维数组转化为低维数组,n代表深度
flatMap:map返回的结果为多维数组,可以使用它给多维数组降维

4.Symbol.prototype.description

通过这个方法可以拿到symbol里面的属性

let s = Symbol('hhh')
console.log(s.description)//输出hhh

六、ES11的新特性

1.私有属性

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 girl = new Person('小红',18,‘50kg’)
//直接输出私有属性就会报错,可以通过内部方法去调用

2.Promise.allSettled

返回的结果始终是成功的,成功的值是每一个promise执行的结果和状态
而promise.all是根据每个promise的结果来决定是否成功,要全成功才能算成功,没有成功的话值就是那个出错的promise的失败的值;成功了的话值就是成功的promise数组

3.String.prototype.matchAll

返回的结果是一个可迭代对象,用于数据的批量读取

let str = `
<ul>
      <li>
            <a>肖申克的救赎</a>
            <p>上映时间:1994-09-10</p>
      </li>
      <li>
             <a>阿甘正传</a>
             <p>上映时间:1994-07-06</p>
      </li>
<ul>`;
const reg = /<li>.*?<a>(.*?)<\/a>.*?<p>(.*?)<\/p>/sg;
const result = str.matchAll(reg)

4.可选链操作符(?.)

类似于短路判断,如果有就执行后面的,免去了层层判断的烦恼

function main(config){
//以前 const dbHost = config && config.db && config.db.host
 const dbHost = config?.db?.host
}
main({
    db:{
        host:'192.168.1.100',
        username:'root'
    }
})
//万一没有,不会报错

5.动态import

静态导入:
import * as 方法名 from “路径”

动态:

import('路径').then(module=>{
    module.hello();
})

6.BigInt

在数字后面加 n
转为大数 : BigInt(n)

大数运算

let max = Number.MAX_SAFE_INTEGER
//普通相加加到1就不能加了
BigInt(max)+2n可以

7.globalThis

始终指向全局对象

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值