ES6笔记

let变量声明以及声明特性:

1. 变量不能重复声明
let a=0             修改值不会==>   let a=0
let a=1 //报错                      a=1    //不会报错
-------------------------------------------------------------------------------------------
2. 具有块级作用域
  {
    let a=0
  }
  console.log(a) //报错 a is not defined
-------------------------------------------------------------------------------------------
3. 不存在变量提升
  console.log(a) //报错
  let a=0
-------------------------------------------------------------------------------------------
4. 不影响作用域链
   let school = '尚硅谷';
   function fn(){
      console.log(school);
   }
   fn(); //打印成功

const声明常量的特点:

1. 一定要赋初始值
   const a //报错
------------------------------------------------------------------------------------------
2.一般常量使用大写(潜规则)
  const A=0
-------------------------------------------------------------------------------------------
3. 常量的值不能修改
   const a=1
   a=2  //报错
-------------------------------------------------------------------------------------------
4. 块级作用域
   {
      const a=1
   }
   console.log(a) //报错
-------------------------------------------------------------------------------------------
5. 对于数组和对象的元素修改,不算做对常量的修改,不会报错
   const num=[1,4,7,8]
   num.push(5)
   console.log(num) //[1, 4, 7, 8, 5] ,不会报错

变量的解构赋值:

数组的解构赋值:
const person=["小王","小李","小黑"]
let [wang,li,hei]=person
console.log(wang) //小王
console.log(li)  //小李
console.log(hei) //小黑
-------------------------------------------------------------------------------------------
对象的解构赋值:
const person={
   name:"小王",
   age:18,
   say:function(){
       console.log("哈哈")
   }
}
let {name,age,say}=person
console.log(name) //小王
console.log(age)  //18
say()  //哈哈

模板字符串:

1. 声明
 let str=`我是一个字符串`
 console.log(str,typeof str) //我是一个字符串 string
-------------------------------------------------------------------------------------------
2. 内容可以直接出现换行符
   let str=`<ul>
             <li>小王</li>
             <li>小李</li>
             <li>小红</li>
            </ul> `
-------------------------------------------------------------------------------------------
3. 变量拼接
 let name="雷军"
 let love=`${name}是我最崇拜的人`
 console.log(love) //雷军是我最崇拜的人

对象的简化写法:

ES6允许在大括号里面,直接写入变量和函数,作为对象的属性和方法。
let name="小王"
let change=function(){
   console.log("我可以改变你")
}
const person={
   name,
   change,
   say(){
       console.log(":和function可以省略")
   }
}

箭头函数:

1. 声明一个函数:
let fn=(a,b)=>{
   return a+b
}
let result=fn(1,2)
console.log(result) //3
-----------------------------------------------------------------------------------------
2. this是静态的,this始终指向函数声明时所在作用域下的this的值。
     let name="小王"
     const myname={
        name:"小黑"
     }
     let getname=()=>{
        console.log(this.name)
     }
     getname.call(myname) //小王  使用call也不会改变this
-----------------------------------------------------------------------------------------
3. 不能作为构造实例化对象
    let person=(name,age)=>{
        this.name=name,
        this.age=age
     }
    let me=new person("小王",12) //报错
-----------------------------------------------------------------------------------------
4. 不能使用arguments
    let fn=(a,b)=>{
      console.log(arguments)
    }
    fn(1,2) //报错
-----------------------------------------------------------------------------------------
5. 箭头函数的简写:
   (1)省略小括号,当形参只有一个的时候
      let add=n=>{
       return n+n
      }
      console.log(add(1)) //2
   (2)省略花括号,当代码体只有一条语句时,此时return必须省略,而且语句的执行结果就是函数的返回值
      let add=n=>n+n
      console.log(add(1)) //2
   
-----------------------------------------------------------------------------------------
注意:箭头函数适合与this无关的回调,像定时器,数组的方法回调
      不适合与this有关的回调,像事件回调,对象的方法

函数参数默认值:

ES6允许给函数参数赋值初始值
1. 形参初始值具有默认值的参数,一般位置要靠后(潜规则)
   function add(a,b=10){
        return a+b
   }
   let result=add(1)
   console.log(result) //11
-------------------------------------------------------------------------------------------
2. 与解构赋值结合
function person({name="小黑",age,height}){
    console.log(name) //小王
    console.log(age) //18
    console.log(height) //180
}
person({
   name:"小王",
   age:18,
   height:180
})

rest参数:

ES6引入rest参数,用于获取函数的实参,用来代替arguments 
注意:得到的是一个数组,而arguments得到的是伪数组
function name(...args){
   console.log(args)
}
name("小王","小黑","小红")   //输出['小王', '小黑', '小红']
-------------------------------------------------------------------------------------------
注意:rest参数必须放在参数最后
function name(a,b,...args){
   console.log(a) //小王
   console.log(b) //小黑
   console.log(args) // ['小红', '小李']
}
name("小王","小黑","小红","小李")

扩展运算符:

...扩展运算符能将数组转换为逗号分隔的参数序列
1. 数组的合并:
     let a=[1,2]
     let b=[3,4]
     let c=[...a,...b]
     console.log(c) //[1, 2, 3, 4]
-------------------------------------------------------------------------------------------
2. 数组的克隆
    let a=[1,2,3,4,5]
    let b=[...a]
    console.log(b) //[1, 2, 3, 4, 5] 
  注意:如果有引用类型是浅拷贝
-------------------------------------------------------------------------------------------
3. 将伪数组转为真正的数组
   const divs=document.querySelector("div")
   const divArr=[...divs]

Symbol:见此博客

迭代器与生成器:见此博客

Promise:见此博客

Set:

ES6提供了新的数据结构Set(集合)。它类似于数组,但成员的值都是唯一的,集合实现了iterator 接口,所以可以使用【扩展运算符】和【for…of…】进行遍历,集合的属性和方法:
1.  size: 返回集合的元素个数
2. add: 增加一个新元素,返回当前集合
3. delete: 删除元素,返回boolean 值
4. has : 检测集合中是否包含某个元素,返回boolean值

 let s=new Set()
 console.log(s,typeof s) //Set(0) {size: 0} 'object'
-----------------------------------------------------------------------------------------
 let s=new Set([1,3,5,7,2,1,3])
 console.log(s) //Set(5) {1, 3, 5, 7, 2} 可以自动去重
-----------------------------------------------------------------------------------------
let s=new Set([1,3,5])
s.size //元素的个数
s.add(7)//添加新元素
s.delete(1)//删除元素
s.has(1)检查是否有此元素
s.clear()//清空
-----------------------------------------------------------------------------------------
可以用for of进行遍历
 let s=new Set([1,3,5])
for(let v of s){
  console.log(v) //1 3 5
}
-----------------------------------------------------------------------------------------
数组去重
let num=[1,2,4,5,3,2,1,5,6]
let result=[...new Set(num)]
console.log(result) // [1, 2, 4, 5, 3, 6]
-----------------------------------------------------------------------------------------
求交集
let num1=[1,2,3,4,2,3]
let num2=[3,4,5,6,4,5]
let result=[...new Set(num1)].filter(item=>{
let s2=new Set(num2)
if(s2.has(item)){
    return true
}else{
    return false
}
})
console.log(result) // [3, 4]
-----------------------------------------------------------------------------------------
求并集
let num1=[1,2,3,4,2,3]
let num2=[3,4,5,6,4,5]
let result=[...new Set([...num1,...num2])] 
console.log(result) //  [1, 2, 3, 4, 5, 6]

Map:

ES6提供了Map数据结构。它类似于对象,也是键值对的集合。但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。Map也实现了iterator 接口,所以可以使用【扩展运算符】和【for…of…】进行遍历。Map的属性和方法:
1)size:返回Map的元素个数
2)set:增加一个新元素,返回当前Map
3)get:返回键名对象的键值
4)has:检测Map中是否包含某个元素,返回boolean值
5)clear:清空集合,返回undefined

    let m=new Map()
     //添加元素
     m.set("name","小王")
     m.set("change",function(){
        console.log("我们可以改变你")
     })
     let sch={
        school:"唐山职业技术学院"
     }
     m.set(sch,["河北","唐山"])
     console.log(m.size)
     //删除
     m.delete("name") 
     //获取
     console.log(m.get(sch))
     //遍历
     for(let v of m){
        console.log(v)
     }
     //清空
     m.clear()

Class类:见此博客

数组的扩展:

1、Number. EPSILON是JavaScript 表示的最小精度
2、二进制和八进制
   0b二进制  
   0o八进制
   0x十六进制
3、Number.isFinite 检测一个数值是否为有限数
4、Number.isNaN检测一个数值是否为NaN
5、Number.parseInt字符串转整数、Number.parseFloat字符串转小数
6、Number.isInteger判断一个数是否为整数
7、Math.trunc 将数字的小数部分抹掉
8、Math.sign 判断一个数到底为正数、负数还是零

对象方法拓展:

1. Object.is 判断两个值是否完全相等(可以比较NaN)
   console.log(Object.is(NaN, NaN)); //ture
   console.log(NaN===NaN) //false
-------------------------------------------------------------------------------------------
2. Object.assign 对象的合并
const config1 = {
    host: 'localhost ',
    port: 3306,
    name: 'root',
    pass: 'root',
    test: 'test'
}
const config2 = {
    host: 'http://atguigu.com',
    port: 33060,
    name: 'baidu.com',
    pass: 'iloveyou',
    test2: 'test2' //有则覆盖,无则不覆盖
}
console.log(Object.assign(config1, config2)); //2覆盖1
-----------------------------------------------------------------------------------------
3、Object. setPrototype0f(设置原型对象)、Object.getPrototypeof(获取原型对象)
   const school = {
    name: '尚硅谷'
   }
   const cities = {
    xiaoqu: ['北京', ' 上海', '深圳']
   }
Object.setPrototypeOf(school, cities); //将cities设置为school的原型对象,但最好不用此方法设置

console.log(Object.getPrototypeOf(school)); //获取school的原型对象

模块化:见此博客

ES7 新特性:

  1. Array.prototype.includes   方法用来检测数组中是否包含某个元素,返回布尔类型值
      let num=[1,3,5,7]
      console.log(num.includes(5)) //true
------------------------------------------------------------------------------------------
  2. 指数操作符,在ES7中引入指数操作符 【**】,用来实现幂运算功能与Math.pow结果相同。
     console.log(2**10) //1024

ES8对象方法的扩展:
   

1.Object.values()方法返回一个给定对象的所有可枚举属性值的数组 (就是返回字典中的键值)
2.Object.entries()方法返回一个给定对象自身可遍历属性[key,value] 的数组 (就相当于是获取字典中的一整个条目,方便创建Map对象)
3.Object.getOwnPropertyDescriptors()该方法返回指定对象所有自身属性的描述对象。(方便深克隆对象)

ES9新特性:

ES9扩展运算符和rest参数
Rest 参数与 spread 扩展运算符在 ES6 中已经引入
不过ES6中只是针对于数组
在ES9 中为对象提供了像数组一样的rest 参数和扩展运算符

rest参数
function fun({name,...user}){
       console.log(name) //小王
       console.log(user) //{age: 18, height: 180}
}
fun({
    name:"小王",
    age:18,
    height:180
})
-------------------------------------------------------------------------------------------
扩展运算符
const a={
    name:'小王'
}
const b={
    age:18
}
const c={
    height:180
}
const d={...a,...b,...c}
console.log(d) //{name: '小王', age: 18, height: 180}

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

原始:
        //声明一个字符串
        let str = '<a href="http://www.baidu.com">百度</a>
        提取url 与 标签文本
        const reg = /<a href="(.*)">(.*)<\/a>/
        //执行  
        const result = reg.exec(str);
        console.log(result);
        console.log(result[1]);
        console.log(result[2]);
 -------------------------------------------------------------------
使用命名捕获分组:
        const reg = /<a href="(?<url>.*)">(?<text>.*)<\/a>/
        const result = reg.exec(str);
        console.log(result)
        console.log(result.groups.url)
        console.log(result.groups.text)

ES9正则扩展:反向断言:

let str = 'JS5211314你晓呆吗5555呜呜呜';
正向断言  取5555
reg = /\d+(?=呜)/
const result = reg.exec(str);
console.log(result);
--------------------------------------------------
反向断言
let str = 'JS5211314你晓呆吗5555呜呜呜';
reg = /(?<=吗)\d+/;
let result = reg.exec(str);
console.log(result);

ES9 正则扩展:dotAll模式 

       //dot  有 . 的意思 而.在正则里表示  元字符(除换行符以外的任意单个字符)
        let str = `
        <ul>
            <li>
                <a>肖生克的救赎</a>
                <p>上映时间:1994-09-10</p>
            </li>
            <li>
                <a>阿甘正传</a>
                <p>上映时间:1994-20-10</p>
            </li>
        </ul>`;
        // 声明正则
        // const reg = /<li>.*?<a>(.*?)<\/a>.*?<p>(.*?)<\/p>/s    
        const reg = /<li>.*?<a>(.*?)<\/a>.*?<p>(.*?)<\/p>/gs 
        let result;
        let data = [];
        while(result = reg.exec(str)){
            data.push({title:result[1],time:result[2]})
        }
        console.log(data);

ES10新特性:

ES10 对象扩展方法Object.fromEntries


Object.fromEntries 和 Object.entries是逆运算
Object.entrise是将对象转换为数组,而Object.fromEntries则是将数组转化为对象。

字符串方法扩展trimStart与trimStart:

trimStart是去除字符串左侧空格,trimEnd是去除字符串右侧空格
let str='   aa   '
console.log(str)
console.log(str.trimStart())
console.log(str.trimEnd())

数组方法扩展flat与flatMap:

flat可译为:平 ;能将多位数组转化为低位数组;如果传参,那么参数位数字,这个数字为转化的深度
flatMap是一个符合操作,可以将Map方法生成的多维数组转化为一维数组
  const arr = [1,2,3,4,5,[6,8,5,[8,9,10,11]]];
  console.log(arr.flat(2));
  const arr1 = [1,2,3,4,5]
  // const arr3 = arr1.map(item => item*10)   // [10, 20, 30, 40, 50]
  const arr3 = arr1.flatMap(item => [item*10])
  console.log(arr3);

symbol.prototype.description:

 Symbol对象的description属性可以获得Symbol对象的值
 let s = Symbol("哈哈")
 console.log(s.description)   //哈哈

ES11:

 ES11 的私有属性:

 ES11的私有属性前要加#来区分,私有属性只能在类里面使用,不能用实例化的对象直接调用

 Promise.allSettled() :

Promise.allSettled() 接收的是一个 Promise对象数组 
 返回的结果永远是Promise对象状态永远是resolve,该结果是数组中的Promise值的返回结果状态+值

字符串方法扩展 String.prototype.matchAll()

该方法是用来得到 正则批量的匹配的结果

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

可选链操作符 ?.

?. 是用来判断对象的层级属性是否存在   


        function main(config) {
            // 不用可选操作符?
            // const dbHost = config && config.db && config.db.host 
            const dbHost = config?.db?.host  //这两条语句 等价
            console.log(dbHost);
 
        }
        main({
            db:{
                host:'127.0.0.1:8000',
                username:'jiajia'
            },
            dba:{
                username:'xiaojiajia',
                password:'123456'
            }
        })

动态import :

动态import即按需加载,可实现import的懒加载效果
ES11的动态import就是不在开头引入,是在需要引入时调用import方法
这个方法返回的是一个Promise对象,可通过这个Promise对象调用模块方法。
import(传入的是模块路径).then(module=>{module.hello()});

BigInt类型:见此博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前端小马

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值