总结归纳

ES 新增运算符的实例:

  1. 可选链运算符(Optional Chaining Operator):

    const person = {  name: 'John',  age: 30 }; const address = person?.address?.street; // 不会报错,返回undefined
    
  2. 空值合并运算符(Nullish Coalescing Operator):

    const name = null; const defaultName = 'Unknown'; const result = name ?? defaultName; // 返回 'Unknown'
    
  3. 大于等于和小于等于的合并运算符(Greater/Less Than or Equal To Operator):

    const x = 1; const y = 2; const result = x <=> y; // 返回 -1
    
  4. 指数运算符(Exponentiation Operator):

    const x = 2; const result = x ** 3; // 返回 8
    
  5. 展开语法(Spread Syntax):

    const arr = [1, 2, 3];  const newArr = [...arr, 4, 5, 6]; // [1, 2, 3, 4, 5, 6]
    
  6. Object.assign() 方法:

    const obj1 = { a: 1 }; const obj2 = { b: 2 }; const obj3 = { c: 3 }; const newObj = Object.assign({}, obj1, obj2, obj3); // { a: 1, b: 2, c: 3 }
    

对数组的操作

操作类型 方法名 描述
栈操作(先进后出) push() 向数组末尾添加一个或更多元素,并返回数组长度
pop() 删除返回数组最后一个元素
队列操作(先进先出) unshift() 向数组的开头添加一个或更多元素,并返回数组长度
shift() 删除返回数组第一个元素
排序方法 soft((a-b)=>return a-b) 按照字符串顺序对数组进行排序
reverse() 反转数组
concat() 把参数拼接到当前数组
操作方法 slice() 从当前数组截取出一个新数组,不影响原数组
splice() 删除或替换当前数组的某些项目,参数start、del、options(要替换的项)
arr=[ ] 清空数组 ;
位置方法 indexof() 搜索数组中的元素,并返回位置,没找到返回-1
lastindexof() 搜索数组中的元素,并返回最后出现的位置,没找到返回-1
array[index] 数组索引对应的数组值
过滤 for(i=0;i<*.length;i++){} 最原始的for,i为遍历的次数,初始值任意
for…in 遍历出index索引,类似for…i,但不可设置初始值
for…of 遍历出每一个子项具体value
every() 检测数值元素的每个元素是否都符合条件,返回bool
filter((item,value)=>{ }) 过滤,检测数组元素,并返回符合条件元素的数组
foreach((item,index)=>{}) 数组每个元素都执行一次回调函数,功能为for…in+for…of
map() 通过制定函数处理数组每个元素,并返回处理后的数组
some() 检测数组元素中的是否有符合指定条件,有一个就跳出循环了
new Set( ) 数组去重
join() 把数组的所有元素连接到一个字符串中

1.Set

let s = new Set()//集合  不重复唯一 只有键
//元素个数
console.log(s.size)
//添加新元素
s.add("aaa")
//删除元素
s.delete("aaa")
//检测元素
s.has("aaa")
//清空
s.clear()//集合有迭代器的接口,所以可以用for...of遍历
for(let i of s){console.log(i)
}

1.1集合实践

        let arr = [1,2,2,3,4,6]//1.数组去重//先将其变为 集合 去重//将 集合 转为 数组//let s = [...new Set(arr)]//console.log(s)//2.交集let arr2 = [4,5,6,5,6]/* let result = [...new Set(arr)].filter(items=>{let s2 = new Set(arr2)//4 5 6 集合if(s2.has(items)){return true}else{return false}}) *///简化写法//let result = [...new Set(arr)].filter(items=>new Set(arr2).has(items))//console.log(result)//3.并集//let union = [...new Set([...arr2,...arr])]//console.log(union)//4.差集let diff = [...new Set(arr)].filter(items=>!(new Set(arr2).has(items)))console.log(diff)

2.Map

键值对的集合,其“键”不限于字符串,可以是各种类型,Map也实现了iterator接口和扩展运算符,升级版对象,其属性可以是其他类型不只字符串

let m = new Map()
//添加元素
m.set("a",1)
m.set("fn",function(){console.log("b")
})
let key = {name:"let"
}
m.set(key,["a","b","c"])
//size获取元素个数
//delete删除元素
//get获取元素
//clear清空
//for...of遍历 [键,值]

ES6

var/let/const

  1. var的缺点:

    1. var关键字 定义的变量 没有 块作用域,只有函数作用域
    2. var定义全局变量会自动添加全局 window对象属性
    3. var 定义的变量 会提前 装载。
  2. var 和 let 区别 ,面试题

    1. var 可以被重复定义, let 不行
    2. var 会声明提升, let 不会
    3. var 声明的 全局变量会成为window上面的一个属性。而let 不会
    4. var 是 函数级作用域,let 是 块级作用域!!!
  3. const:

    1. 常量必须 附上初始值!!!
    2. 常量 也有 块级作用域!!
    3. 数组 也可以被定义成 常量
    4. 数组可以根据下标更改值
  4. var,let,const区别

    1. var 级别作用域 存在变量提升 值可以更改
    2. let 块级作用域 不存在变量提升 值可以更改
    3. const 块级作用域 不存在变量提升 值不可以更改

解构赋值

ES6中允许按照一定模式从数组对象中提取值。对变量进行赋值,相当于破坏其原有结构,直接将值赋给新变量,下次直接用新变量就行

//1.数组解构
const arr = ['A','B','C']
let [a,b,c] = arrconsole.log(a)//A
console.log(b)//B
console.log(c)//C//2.对象解构
const obj = {name:'lei',age:23,city: function(){console.log("重庆")}
}
//属性名和变量名要一样!
let {name,age,city} = obj
console.log(name)//lei
console.log(age)//23
console.log(city)//function
city()//重庆//3.在获取网络请求数据时
this.$axios({url:"www.baidu.com",method:"get",success:(data)=>{const {data:res}=response//效果 => const res=response.data,看不出简便,但是up主们都喜欢这样写}
})

模板字符串

let str = [`字符串`]
//1.可以有HTML标签
//2.变量拼接
let str ='ssss'
let str1 = 'aaaa'
let str2 = `${str}${str1}`

简化对象写法

ES6允许在大括号里面,直接写入变量和函数,前提要声明赋值,作为对象的属性和方法

let name = 'a'
let change = function(){console.log("b")
}
const sss = {name,change,//improve:function(){//console.log("b")//}  方法简写improve(){console.log("b")}
}

箭头函数

let fn = (a,b) => {// =>相当于functionreturn a+b
}
fn(1,2)//3//1.this静态,this 总是指向 函数定义时 所在 作用域 下的this值!任何方式均不能改变指向
function getName() {console.log(tihs.name)
}
let getName2 = () => {console.log(tihs.name)
}
const city = {name:'重庆'
}
window.name = '成都'
//直接调用,均为成都
//call
getName.call(city)//重庆
getName2.call(city)//成都//2.不能作为构造函数去实例化对象
//3.不能使用arguments变量
//4.箭头函数简写//1)省略(),当形参有且只有一个let add = n =>{return n+n}//2)省略{},当代码体只有一条语句,此时return省略,且执行结果就是函数返回值let add = n =>  n+nconsole.log(add(3))//6//箭头函数适合与 this无关 的回调,如计时器,数组方法回调

参数默认值设置

//1.形参默认值,有默认值的一般靠后
function add(a,b=2){return a + b
}
let c = add(1)
console.log(c)//3//2.与解构赋值结合
function con({v1,v2,v3='c'}){console.log(v1)console.log(v2)console.log(v3)
}
//调用con函数相当于 {v1,v2} = {v1:'a',v2:'b'} //解构赋值
con({v1:'a',v2:'b'
})//a b c

rest参数

获取函数的实参,代替arguments

//ES5获取实参的方式
function data(){console.log(arguments)
}
data('a','b','c')//返回的对象
//rest参数,必须放到参数的最后!
function data(A,...args){console.log(A,args)
}
data('a','b','c')//a ['b','c']

…扩展运算符

将数组转换为逗号分隔的参数序列,化整为散/化散为整

const name = ['a','b','c']
function fn(){console.log(arguments)//返回的是object类型
}// fn(['a','b','c'])
fn(name)//{['a','b','c']}  // 使用扩展运算符后 => fn('a','b','c')
fn(...name)//{'a','b','c'} //1.数组合并
const a1 = ['1','2']
const a2 = ['3','4']
const a3 = [...a1,...a2]
console.log(a3)//['1','2','3','4']//2.数组克隆
const b1 = [5,6,7]
const b2 = [...b1]
console.log(b2)//[5,6,7]  浅拷贝 有引用数据类型也是 拷贝其地址值//3.伪数组转真数组
const divs = documentquerySelectorAll('div')
const divArr = [...divs]

Symbol

ES6新引入的原始数据类型,表示独一无二的值,类似于字符串的数据类型,第一次看不懂正常,等过段时间在回过头看就可以理解了

使用场景:

  • 一些值不能重复的地方(例如:下面讲的es6的生成器)

特点:

  • 值是唯一的,用来解决命名冲突的问题
  • 不能与其他数据进行运算
  • 其定义的对象属性不能使用for…in循环遍历,但可以使用Reflect.ownKeys来获取对象的所有键名
let s = Symbol()//Symbol不是一个 构造 函数,所以s不是实例对象
console.log(s,typeof s)//Symbol() "symbol"
let s1 = Symbol('描述字符串')
let s2 = Symbol('描述字符串')
console.log(s1 === s2)//false   描述可以相同,但其id不同有点类似不同对象的地址值//Symbol.for 创建  Symbol为函数对象
let s3 = Symbol.for('a')
let s4 = Symbol.for('a')
console.log(s3 === s4)//true
//不能与其他数据进行运算(任何)//向对象添加属性和方法
let game = {}
//再声明一个对象
let methods = {up:Symbol("向上"),down:Symbol("向下")
}//注意这两个相同,可以理解为俩个地址值//添加
game[methods.up] = function(){console.log("上")
}
game[methods.down] = function(){console.log("下")
}
//尽管原对象内有up或者down的方法也不影响,相当于加的Symbol("向上")和Symbol("向下"),独立的let game ={name:'lol',[Symbol('hero')]:function(){//Symbol('hero')动态的并不跟name一样固定所以加[]console.log('yasuo')}
}console.log(game)//要调用Symbol则在外部声明变量存储,属性名改为变量,再对象.方法调用
复制代码

Symbol内置属性

//自定义类型检测
class Person{static [Symbol.hasInstance](param){console.log(param)}
}
let o = {}
console.log(o instanceof Person)//决定数组是否展开
const arr = [1,2,3]
const arr1 = [2,2,3]
arr1[Symbol.isConcatSpreadable] = false//Symbol属性再作为对象属性的扩展
console.log(arr.concat(arr1))//[1, 2, 3, Array(3)]
复制代码

迭代器

一种接口,部署Iterator接口(对象里的一个属性,Symbol.iterator),完成遍历

  1. ES6创造了一种新的遍历命令 for…of循环,由Iterator操作
  2. 能具备iterator接口的数据
    1. Arry
    2. Arguments
    3. Set
    4. Map
    5. String
    6. TypedArray
    7. NodeList
const arr = ['a','b','b']
for(let a in arr){//in 是索引console.log(a)//0,1,2
}//迭代器
for(let a of arr){//of 是键值console.log(a)//'a','b','b'
}
  1. 工作原理

    1. 创建一个指针对象,指向当前数据结构的起始位置
    2. 第一次调用对象的next方法,指针自动指向数据结构的第一个成员
    3. 接下来不断调用next方法,指针一直往后移动,直到最后一个成员
    4. 每调用next方法返回一个包含value和done属性的对象

    【注意】需要自定义遍历数据时,要想到使用迭代器

const name = ['a','b','c']
//创建指针对象
let iterator = name[Symbol.iterator]()
//调用对象的next方法
console.log(iterator.next())//{value: 'a', done: false}
console.log(iterator.next())//{value: 'b', done: false}
console.log(iterator.next())//{value: 'c', done: false}
console.log(iterator.next())//{value: undefined, done: true}//迭代器应用
//声明一个对象
const ban = {name:'a',stu:['x','y','z'],[Symbol.iterator](){//索引变量let index = 0let _this = thisreturn {next:function(){if(index < _this.stu.length){const res =  {value:_this.stu[index],done:false}//下标自增index++//返回结果return res}else{return {value:undefined,done:true}}}}}
}
//针对性遍历这个对象
for(let i of ban){console.log(i)
}
复制代码

Generator函数( 生成器 yeild)

ES6提供的一种异步编程解决方案,一种特殊的函数

function * gen (){// * 生成器函数console.log('a')yield 'lllll'// yield函数代码分隔符  类型matlab间隔符执行console.log('b')
}let ietrator = gen ()//迭代器对象
ietrator.next()//a  是一个迭代器 ,需要next()才能输出,跟传统函数有出入
ietrator.next()//b
/*            *******                        */
function * gen (){// * 生成器函数yield 'lllll'// yield函数代码分隔符  类型matlab间隔符执行yield 'aaaaaa'yield 'vbbbbb'
}let ietrator = gen ()//迭代器对象
console.log(ietrator.next())//{value: 'lllll', done: false}
console.log(ietrator.next())//{value: 'aaaaaa', done: false}
console.log(ietrator.next())//{value: 'vbbbbb', done: false}
console.log(ietrator.next())//{value: undefined, done: true}for(let i of gen()){console.log(i)
}//lllll aaaaaa vbbbbb复制代码

生成器函数参数

{// 传统函数function foo() {return 'hello world'}foo()   // 'hello world',一旦调用立即执行// Generator函数function* generator() {yield 'status one'         // yield 表达式是暂停执行的标记  return 'hello world'}let iterator = generator()   // 调用 Generator函数,函数并没有执行,返回的是一个Iterator对象iterator.next()              // {value: "status one", done: false},value 表示返回值,done 表示遍历还没有结束iterator.next()              // {value: "hello world", done: true},value 表示返回值,done 表示遍历结束
}

生成器函数实例

//异步编程  文件操作  网络操作(ajax,request)数据库操作
//1s后 控制台输出 111 2s后输出222 3s后输出333
//回调地狱 不停回调 一直嵌套
setTimeout(() => {console.log(111)setTimeout(() => {console.log(222)setTimeout(() => {console.log(333)}, 3000);}, 2000);
}, 1000);//生成器函数解决回调地狱
function one(){setTimeout(() => {console.log(111)iterator.next()//调用执行yield two()}, 1000);
}
function two(){setTimeout(() => {console.log(222)iterator.next()//调用执行yield three()}, 2000);
}
function three(){setTimeout(() => {console.log(333)iterator.next()//调用执行.......可以解决回调地狱}, 3000);
}
function * gen(){//依次迭代调用yield one()yield two()yield three()
}
//调用生成器函数
let iterator = gen()
iterator.next()//每调用一次执行一次//生成器函数依次获取用户数据 订单数据 商品数据
function users(){setTimeout(() => {let data = 'user'ite.next(data)//第二次调用执行yield orders() 并将data作为参数传入users}, 1000);
}
function orders(){setTimeout(() => {let data = 'orders'ite.next(data)//调用执行yield goods() 参数传入orders}, 1000);
}
function goods(){setTimeout(() => {let data = 'goods'ite.next(data)//第四次调用,参数传入goods}, 1000);
}
function * gen(){//依次迭代调用let users1 = yield users()console.log(users1)let orders1 = yield orders()console.log(orders1)let goods1 = yield goods()console.log(goods1)
}
let ite = gen()
ite.next()//第一次调用 yield users()

*Promise

ES6引入的异步编程新解决方案。语法上Promise是一个构造函数,用来封装异步操作并可以获取其成功或失败的结果

  1. Promise 构造函数:Promise(excutor){}
  2. Promise.prototype.then 方法
  3. Promise.prototype.catch 方法
//实例化Promise对象
const p = new Promise(function(resolve,reject){setTimeout(() => {/*         let data = 'data'resolve(data)//执行resolve表明调用成功 */let data = 'error'reject(data)//执行reject表明调用失败,执行.then中的第二个回调函数}, 1000);
})//调用promise对象的then方法
p.then(function(value){console.log(value)//执行resolve后
},function(reson){console.log(reson)//执行reject后
})//Promise封装AJAX请求
//接口地址:https://api.apiopen.top/getJokeconst p =new Promise((resolve,reject) => {//1.创建对象const xhr = new XMLHttpRequest()//2.初始化xhr.open("GET","https://api.apiopen.top/getJoke")//3.发送xhr.send()//4.绑定事件xhr.onreadystatechange = function(){if(xhr.readyState === 4){if(xhr.status>=200&&xhr.status<300){//请求成功resolve(xhr.response)}else{//请求失败reject(xhr.response)}}}})
//把请求结果提取出来,在外面进一步处理,不用在内部处理p.then(function(value){console.log(value)},function(reason){console.error(reason)})
复制代码//创建promise对象const p = new Promise((resolve,reject)=>{setTimeout(() => {resolve('data')//reject('error')}, 1000);})
//then 方法的返回结果是Promise对象,对象状态由回调函数的执行结果决定
//1.如果回调函数中返回的结果是 非Promise类型的属性(数值、字符串、不返回undefined等),状态为成功,返回值为对象的成功的值
//2.如果返回结果是promise对象,则该该promise对象的状态类型是什么返回的就是什么
//3.若抛出错误,则promise的返回rejected,且其值是抛出的值const result = p.then(value => {//1.非promise类型的属性return 123//执行则其状态为成功其result的成功值为123//2.是promise对象return new Promise((resolve,reject)=>{resolve('OK')}) //3.抛出错误throw new Error("出错")},reason => {console.warn(reason)}) //4.链式调用 嵌套异步任务p.then(value=>{},reason=>{}).then(value=>{},reason=>{})console.log(result)
复制代码

Promise实践

//引入fs模块
const { rejects } = require("assert")
const fs = require("fs")
const { resolve } = require("path/win32")/* fs.readFile('文件.md',(err,data1)=>{fs.readFile("文件2.md",(err,data2)=>{fs.readFile("文件3.md",(err,data3)=>{let result = data1+'\r\n'+data2+'\r\n'+data3console.log(result)})})
}) *///传统方法实现易造成回调地狱//使用Promise实现
const p = new Promise((resolve,reject)=>{fs.readFile('文件.md',(err,data)=>{//第一个异步任务resolve(data)})
})p.then(value=>{//value第一个文件内容//为避免回调地狱,再次搞一个promis对象,将其提出,再次.thenreturn new Promise((resolve,reject)=>{//第二个异步任务fs.readFile('文件2.md',(err,data)=>{//data第二个文件内容resolve([value,data])//成功,返回也是成功})})
}).then(value=>{//一个包含文件和文件2内容的数组return new Promise((resolve,reject)=>{//第三个异步fs.readFile('文件3.md',(err,data)=>{//data第三个文件内容value.push(data)//数组压入resolve(value)//成功 返回也成功})})
}).then(value=>{//所有文件的数组console.log(value.join('\r\n'))
})复制代码

Pormise对象catch方法

        const p = new Promise((value,reject)=>{setTimeout(() => {reject("出错!")}, 1000);})
/*         p.then(value=>{},reason=>{console.error(reason)}) *///then方法不指定第一个参数,即catchp.catch(reason=>{console.warn(reason)})

Set

let s = new Set()//集合  不重复唯一 只有键
//元素个数
console.log(s.size)
//添加新元素
s.add("aaa")
//删除元素
s.delete("aaa")
//检测元素
s.has("aaa")
//清空
s.clear()//集合有迭代器的接口,所以可以用for...of遍历
for(let i of s){console.log(i)
}

集合实践

        let arr = [1,2,2,3,4,6]//1.数组去重//先将其变为 集合 去重//将 集合 转为 数组//let s = [...new Set(arr)]//console.log(s)//2.交集let arr2 = [4,5,6,5,6]/* let result = [...new Set(arr)].filter(items=>{let s2 = new Set(arr2)//4 5 6 集合if(s2.has(items)){return true}else{return false}}) *///简化写法//let result = [...new Set(arr)].filter(items=>new Set(arr2).has(items))//console.log(result)//3.并集//let union = [...new Set([...arr2,...arr])]//console.log(union)//4.差集let diff = [...new Set(arr)].filter(items=>!(new Set(arr2).has(items)))console.log(diff)

Map

键值对的集合,其“键”不限于字符串,可以是各种类型,Map也实现了iterator接口和扩展运算符,升级版对象,其属性可以是其他类型不只字符串

let m = new Map()
//添加元素
m.set("a",1)
m.set("fn",function(){console.log("b")
})
let key = {name:"let"
}
m.set(key,["a","b","c"])
//size获取元素个数
//delete删除元素
//get获取元素
//clear清空
//for...of遍历 [键,值]

Class类

对象的模板,可以看作一个语法糖

        //手机
/*         function Phone(brand,price){this.brand = brandthis.price = price}//添加方法Phone.prototype.call = function(){console.log("打电话")}//实例化对象let xiaomi = new Phone("小米",2000)xiaomi.call()console.log(xiaomi) *///classclass Phone{//构造函数 名字不能修改constructor(brand,price){this.brand = brandthis.price = price}//方法必须使用该语法,不能使用ES5的对象完整形式即a:funciton(){}call(){console.log("打电话!")}}let oppo = new Phone("a",2000)console.log(oppo)
复制代码

类的静态成员

class Phone{//静态属性static name = '手机'static change(){console.log("a")}
}
let n = new Phone()//实例对象的属性与构造函数的属性并不相同,两个不同对象其在堆内存位置都不同
console.log(n.name)//undefined
console.log(Phone.name)//手机
复制代码

类继承

//ES5
function Phone(brand,price){//父类型this.brand = brandthis.price = price
}
Phone.prototype.call = function(){console.log("打电话")
}
//智能手机 子类型
function SmartPhone(brand,price,color,size){Phone.call(this,brand,price)//改变this指向,指向SmartPhone的new的实例对象this.color = color//this指向该构造函数new的对象this.size  = size
}
//设置子级构造函数的原型
SmartPhone.prototype = new Phone() //为了调用父类方法,但改变了constrcutor指向
//console.log(SmartPhone.prototype.constructor)//指向Phnoe,意思是Phone是其构造函数,很明显该是SmartPhone
SmartPhone.prototype.constructor = SmartPhone
//声明子类的方法
SmartPhone.prototype.phtot = function(){console.log("拍照")
}
const iPhone = new SmartPhone("a",2500,'b',5)
console.log(iPhone)//class
//可以明显看出通过class的类继承简洁很多,不需要设置子集构造函数的原型和constructor
class Phone{//构建父类constructor(brand,price){this.brand = brandthis.price = price}call(){console.log("打电话")}
}//子类
class SmartPhone extends Phone {constructor(brand,price,size){super(brand,price)//Phone.call(this,brand,price)this.size = size}photo(){console.log("拍照")}//对父类方法的重写 ,对于调用父类的方法若子类自身含有重名则必定调用自己的而不是父类,super()也不行call(){console.log("视频通话")}
}const xiaomi = new SmartPhone('小米',"800","大")
console.log(xiaomi)
xiaomi.call()
复制代码

get和set

        class Phone {get price () {//调用属性就执行内部的函数,类似动态监控console.log("属性被调用")return "true"}set price(newVal){//监控更新数据console.log("被赋新值")}}const obj = new Phone()console.log(obj.price)obj.price = "100"
复制代码

Number方法扩展

        //0.Number.EPSILON 是 JS 表示的最小精度 其值接近2.22E-16console.log(0.1+0.2 === 0.3)//falsefunction equal(a,b){if(Math.abs(a-b)<Number.EPSILON){return true}else{return false}}console.log(equal(0.1+0.2,0.3))//true//1.二进制和八进制let b = 0b1010//2进制let o = 0o777//8进制let d = 100let x = 0xff//16进制//2.检测一个数值是否为有限数  Number.isFiniteconsole.log(Number.isFinite(01))//trueconsole.log(Number.isFinite(100/0))//falseconsole.log(Number.isFinite(Infinity))//false//3.检测一个数值是否为 NaN  Number.isNaN//4.Number.parseInt Number.parseFloat 将字符串转为整数或浮点数(只返回数值部分,过滤字符部分)console.log(Number.parseInt('11是1啊s'))//11console.log(Number.parseFloat('5884588啊s'))//5884588//5.Number.isInteger 判断一个数是否为整数//6.Math.trunc 抹去小数部分//7.Math.sign 判断一个数是正数 负数  还是 零console.log(Math.sign(100))//1console.log(Math.sign(0))//0console.log(Math.sign(-5))//-1
复制代码

Object方法扩展

        //1.Object.is 判断两个值是否完全相等console.log(Object.is(120,120))//trueconsole.log(Object.is(NaN,NaN))//trueconsole.log(NaN === NaN)//false//2.Object.assign 对象合并const p1 = {a:"1",b:"2",c:"3"}const p2 = {a:"A",b:"B"}//p1为基础模板,p2若有其对于属性则覆盖没有则不覆盖console.log(Object.assign(p1,p2))//{a: 'A', b: 'B', c: '3'}//还可以用...拓展运算符合并(ES9)console.log({...p1,...p2})//3.Object.setPrototypeOf 设置原型对象  Object.getPrototypeOf获取原型对象const s1 = {name:"a"}const s2 = {city:"b"}Object.setPrototypeOf(s1,s2)//对s1对象的原型上设置console.log(Object.getPrototypeOf(s1))
//ES8
//Object.values Object.entries
//1.Object.values()返回一个给定对象的 所有 可枚举属性的 数组
//2.Object.entries()返回一个给定对象 自身 可遍历属性[key,value]的 数组 可以创建Map
const m = new Map(Object.entries(s))
//对象属性的描述对象
Object.getOwnPropertyDescriptors()
复制代码

模块化

将一个大的程序文件**,拆分**成许多小的文件,然后将小文件组合起来

好处:

  • 防止命名冲突
  • 代码复用(各部分独立互不干预)
  • 高维护性

语法

模块化功能主要由两个命令构成:export和import

  • export命令用于规定模块的对外接口(这样就不需要导入整个文件而是其中一些数据比如一个最终结果)
  • import命令用于输入其他模块提供的功能
//分别暴露export let s = "a"export function fn(){console.log("bbbbb")
}//统一暴露let s = "a"function fn(){console.log("bbbbb")
}export {s,fn} import * as module from "./module.js"console.log(module)//Symbol//默认暴露
export default{a:"1",fn:function(){console.log("ssss")}
}
//调用import * as module from "./module.js"module.default.fn()
复制代码

模块引入方式

        //1.通用导入方式//引入 module.jsimport * as module from "./module3.js"console.log(module.default.a)//2.结构赋值形式import {s,fn} from "./module1.js"//分别暴露import {s as s1,fn as fn1} from "./module2.js"//统一暴露import {defualt as m3} from "./module3.js"//默认暴露 default要有别名//3.简便形式 针对默认暴露import m3 from"./module3.js"

ES7

  1. Array.prototype.includes

    检测数组中是否包含某个元素,返回布尔类型值

  2. 指数操作符

    **,用来实现幂运算,功能与Math.pow结果相同

ES8

async和await两种语法可以让异步代码像同步代码一样

async

  1. async函数的返回值为promise对象

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

            //async函数async function fn(){return "aaaa"}console.log(fn())//promise对象 成功
    复制代码
    

【注】返回的不是promise类型的对象都是成功promise,但若抛出错误则返回失败promise对象,返回的一个promise对象,根据该promise成功与否决定返回的promise对象的值,即一一对应

await

  1. 必须写在async函数内
  2. await右侧的表达式一般为promise对象
  3. await返回的是promise成功的值
  4. await的promise失败,则会抛出异常,需要通过try…catch捕获处理
        //await 要处于 async中,单向依赖const p = new Promise((resolve,reject)=>{//resolve("a")reject("warn")})async function fn(){try{//resolvelet result = await pconsole.log(result)}catch(e){//rejectconsole.log(e)}}fn()//1.引入fs模块
const { rejects } = require("assert")
const fs = require("fs")
const { resolve } = require("path/posix")
//读取文件
function read1(){return new Promise((resolve,reject)=>{fs.readFile("文件.md",(err,data)=>{if(err) reject(err)resolve(data)})
})
}
function read2(){return new Promise((resolve,reject)=>{fs.readFile("文件2.md",(err,data)=>{if(err) reject(err)resolve(data)})
})
}
function read3(){return new Promise((resolve,reject)=>{fs.readFile("文件3.md",(err,data)=>{if(err) reject(err)resolve(data)})
})
}//声明async函数
async function main(){//获取文件内容let a1 = await read1()let a2 = await read2()let a3 = await read3()console.log(a1.toString())console.log(a2.toString())console.log(a3.toString())}
main()

async和await封装ajax请求

         function sendAJAX(url) {return new Promise((resolve,reject)=>{//1.创建对象const x = new XMLHttpRequest()//2.初始化x.open('GET',url)//3.发送x.send()//4.事件绑定x.onreadystatechange = function () {if(x.readyState === 4){if(x.status>=200&&x.status<300){resolve(x.response)//返回给promise对象}else{reject(x.response)}}}})}//promise then 测试
/*         const a = sendAJAX("https://api.apiopen.top/getJoke").then(value=>{console.log(value)},reason=>{})console.log(a) *///async await 测试 axiosasync function fn(url) {const b =  await sendAJAX(url)//返回一个成功的promise对象且其值为成功值console.log(b)}let url = "https://api.apiopen.top/getJoke"fn(url)

ES9

对象展开

//在ES6中的rest参数只针对数组
//ES9中为 对象 提供了像数组一样的rest 参数和扩展运算符function connect({host,port,...a}) {//...a 对象{user:'b',pass:22222}console.log(host)console.log(port)console.log(a)}connect({host:'a',port:1020,user:'b',pass:22222}).

正则命名扩展

//一般捕获
let str = "<a href='aaaaaaaaaaa'>bbbb</a>"
const reg = /<a href='(.*)'>(.*)<\/a>/
const result = reg.exec(str)
console.log(result[1])
console.log(result[2])
//捕获分组(对象)
let str = "<a href='aaaaaaaaaaa'>bbbb</a>"
const reg = /<a href='(?<url>.*)'>(?<text>.*)<\/a>/  //url和text是分组属性名
const result = reg.exec(str)
console.log(result.groups.url)

反向断言

//正向断言
let str = 'asdasdasda你你你77零零零零'
const reg = /\d+(?=零)/
const result = reg.exec(str)//77
//反向断言
let str = 'asdasdasda你你你77零零零零'
const reg = /(?<=你)\d+/
const result = reg.exec(str)//77

dotAll模式

一般针对HTML结构的换行处理/.*?/s

ES10

Object.fromEntries

//二维数组或者Map
//转为对象
复制代码

Object.entries

//将对象转为数组,且为[key,value]形式
复制代码

trimStart&trimEnd

//str.trimStart() 左边空白
//str.trimEnd()   右边空白
复制代码

Array.prototype.flat&Array.prototype.flatMap

//flat 平
//多维转低维
arr.flat(n)//n是深度
//flatMap
//map返回结果若是多维数组再经过flat降维
arr.flatMap
复制代码

ES11

私有属性

 class Person{//私有属性除非自身输出,不然外部是调用不了的//共有属性name//私有属性#ageconstructor(name,age){this.name = namethis.#age = age}infor(){console.log(this.name)console.log(this.#age)}}const p = new Person('aa',21)p.infor()

promise.allSettled

const p1 = new Promise((resolve,reject)=>{setTimeout(() => {resolve("1111")}, 1000);
})
const p2 = new Promise((resolve,reject)=>{setTimeout(() => {reject("2222")}, 1000);
})//调用allSettled方法
//const result = Promise.allSettled([p1,p2])//返回一个promise对象,且都是成功状态,其结果值是一个数组,数组内是对象,对象中为返回结果状态信息和具体值
const res = Promise.all([p1,p2])//所有promise对象有一个失败就是失败得到失败的值,只有全部成功才返回所有成功的promise值
console.log(res)

Srting.prototype.matchAll

//正则批量匹配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...ofconst arr = [...result]console.log(arr)

可选链操作符

function main(config) {//const dbHost = config && config.db &&config.db.hostconst dbHost = config?.db?.hostconsole.log(dbHost)
}
main({//没有也不报错,返undefineddb:{host:'aaa'}
})
复制代码

动态import加载

const btn =document.getElementById('btn')
btn.onclick = function () {//动态导入的模块为promise对象,其.then的返回值为js文件中export的代码import('./module.js').then(module=>{module.fn()})
}

Bigint

//大整形
let n = 520n
//函数
console.log(Bigint(123))//123n  浮点型不行
//大数值运算  Bigint不能直接与一般数值进行运算,需要对一般数值进行Bigint转换
复制代码

绝对全局对象

ES6~11:全部内容(2w+字)推荐全文复制到md文档,或者word文档相关推荐

  1. 计算机打字自动换行怎么,Word文档一行才输入几个字就自动换行了如何解决

    Word文档一行才输入几个字就自动换行了如何解决 腾讯视频/爱奇艺/优酷/外卖 充值4折起 我们在使用Word文档进行编辑文字的时候,经常会遇到这样那样的问题,今天就跟大家介绍一下Word文档一行才输 ...

  2. c#如何合并多个word文档中的内容到一个word中

    1.添加系统引用Microsoft.Office.Interop.Word; 2.相关的函数说明 WdDocumentType 枚举 (Word) 指定文档类型. 名称               值 ...

  3. 【操作word】Java + POI导出富文本的内容到word文档

    这周工作中,遇到一个需求是需要将数据库中富文本内容导出到word文档里面,于是就采用POI技术实现了一下导出word文档的功能.(word文档是识别html内容的,所以富文本内容也自然能够识别.) 一 ...

  4. word文档批量生成工具(附免费软件)(按Excel表格内容自动替换内容生成文档)

    批量生成word文档是让人无比厌恶但有时又不得不做的事情.比如学校要给拟录取的学生发通知书,就可能需要批量生成一批只有"姓名"."学院"和"专业&qu ...

  5. 落魄前端,整理给自己的前端知识体系复习大纲(上篇,2w字)

    作者:逐步前行 https://juejin.im/post/6867715946941775885 阅读前言 转眼间9月的到来,十分感慨这时光的飞逝.9月对程序员有着十分重要的意义,想在这个优胜劣汰 ...

  6. 1.2W 字的 SQL 语法速成手册

    来源 |https://juejin.im/post/5c7e524af265da2d914db18f 本文针对关系型数据库的一般语法.限于篇幅,本文侧重说明用法,不会展开讲解特性.原理.本文内容包括 ...

  7. 2w字Python列表,全了!

    2w字Python列表,全了! 即使再小的帆也能远航~ 一.目录 序列 1.1 索引 1.2 切片 1.3 序列相加 1.4 乘法(Multiplying) 1.5 检查某个元素是否是序列的成员(元素 ...

  8. 8年测试经验,耗时一星期整理的40道自动化测试面试题(附精准答案),爆肝2W字..........

    转眼金三银四的招聘季已经来了,没点真本事真技术,没点面试经验,不了解点职场套路,如何在面试中过五关斩六将?如何打败面试官?如何拿下那梦寐以求的offer呢? 如果你的跳槽意向已经很确定了,那么请接着往 ...

  9. 2021 版 Spring Boot 基础知识复习手册(2w字,建议收藏)

    点击上方 好好学java ,选择 星标 公众号重磅资讯,干货,第一时间送达 今日推荐:分享一套基于SpringBoot和Vue的企业级中后台开源项目,这个项目有点哇塞!个人原创100W +访问量博客: ...

最新文章

  1. 工业界如何解决NER问题?12个trick,与你分享~
  2. 你还能再“二”一些吗?
  3. 读取缓存行的伪共享问题
  4. 调多大的角度 计算几何
  5. 代码演示C#各版本新功能
  6. [转]LVS负载均衡(LVS简介、三种工作模式、十种调度算法)
  7. axure文本框提示文字_Axure教程:一个中继器实现密码验证
  8. AI开发者十问:10分钟了解AI开发的基本过程
  9. 2018-2019-2 20175320实验三《敏捷开发与XP实践》实验报告
  10. android面试经典,Android经典面试题集锦(一)
  11. 计算机技术在足球的应用,图象处理技术在足球机器人中的应用研究
  12. 知识蒸馏 | 知识蒸馏的算法原理与其他拓展介绍
  13. windows基线加固
  14. 第22期《杂聊1:易破解密码列表》
  15. 彻底解决Chrome自动更新方案
  16. pyqt5 失焦 监听无操作 定时器
  17. HDU 4911 Inversion - 疯狂的癫子 解题心得
  18. 2013年各大小IT公司待遇,绝对真实,一线数据!
  19. 使用高德JS-API进行基于LBS的开发-地图初始化地图控件
  20. yum到底是干什么的?

热门文章

  1. 立国之本——制造业,云计算、大数据助推升级中
  2. 华为P40是不是鸿蒙,华为p40是不是鸿蒙系统
  3. python关键词 打标签详解_Python学习日记13|利用python制作简书首页热门文章关键词标签云...
  4. AndroidStudio快捷键中文版
  5. NKOJ 3702 打鼹鼠
  6. 2023年国产CRM客户管理系统软件排名
  7. Adaptive AUTOSAR (AP) 平台设计(6)——通信管理
  8. c++错误:Process returned -1073741571 (0xC00000FD)
  9. 「SAP技术」 SAP MM MPN物料的采购初探
  10. Https证书/SSL证书异常导致访问失败该如何解决?