ES&12知识点

Wenn 于 2022-10-26 发布

Array Includes

const names =  [1,2,3,NaN]

//在es7之前一般使用indexOf来判断数组中是否包含某项
if(names.indexOf(1) !== -1)console.log('包含该元素')

//es7
if(names.includes(1))console.log('包含该元素')

//但是使用indexOf无法判断数组中是否存在NaN,使用includes可以判断
if(names.indexOf(NaN)!== -1)console.log('包含NaN元素') //不会执行

if(names.includes(NaN))console.log('包含NaN元素')  

指数运算符

//如果想得到数字的平方,在es7之前需要调用Math方法
const res1 = Math.pow(3,3)  //27 3的三次方
const res = 3 ** 3   //es新增

ES8 Object Values

//获取对象的所有value值
const obj ={name:'xi',age:20}
const objV = Object.values(obj)  //返回一个数组['xi',20]

Object entries

const obj = {name:'xi',age:20}
//以数组的形式存在,方便遍历
const arr = Object.entries(obj) //[['name','xi'],['age',20]]
arr.forEach(item=>console.log(item[0],item[1]))   //name 'xi',age 20

String Padding填充

const message = 'Hello World'
const newMessage = message.padStart(15,'*')  //****Hello World
//第一个参数为位数,以这个位数为准,往前填充,如果第二个参数有,则使用第二个参数进行填充,返回一个新的变量
const newnewMessage = message.padEnd(15,'-')  //Hello World----
//第一个参数为位数,以这个为数为准,向后填充,如果第二个参数有,则使用第二个参数进行填充

//一般使用在银行卡或某些隐私显示处
const cardNumber = 11010111010101
const lastNumber = cardNumber.slice(-4)  //0101
const finalNumber = lastNumber.padStart(cardNumber,'*') //**********0101

Object Descriptors

const obj = {
    name:'xi',
    age:20,
    gendelr:'male'
}

console.log(Object.getOwnPropertyDescriptor(obj))  //undefined
console.log(Object.getOwnPropertyDescriptors(obj))  //V得到如下
  1. {name: {…}, age: {…}, gendelr: {…}}

    1. age: {value: 20, writable: true, enumerable: true, configurable: true}
    2. gendelr: {value: ‘male’, writable: true, enumerable: true, configurable: true}
    3. name: {value: ‘xi’, writable: true, enumerable: true, configurable: true}

Promise async await

async foo(){
    await axios({})
}

ES10 flat flatMap降维

const arr = [1,2,[3,4],[[5,6],[7,8]]]
const arr2 = arr.flat() //默认为1  [1,2,3,4,[5,6],[7,8]]
const arr3 = arr.flat(2) //[1,2,3,4,5,6,7,8]  每一项为独立的

const messages = ['Hello World']
const words = messages.flatMap(item=>{ //['Hello','World']  顺便降维
    return item.split(' ')   
})
const words2 = messages.Map(item=>{ //[['Hello','World']]  还需要降维
    return item.split(' ')
})

Object fromEntries

const obj = {name:'xi',age:20}
const arr = Object.entries(obj) //[['name','xi'],['age',20]]
//如果得到了entries的数据格式,想回返原来的格式
const newObj = Object.fromEntries(arr)   //{name:'xi',age:20}
//应用场景
const queryString = 'name=why&age=20&height=1.88'
const queryParams = new URLSearchParams(queryString)
//[['name','why'],['age',20],['height',1.88]]  //得到的是一个数组可以进行遍历
const paramObj = Object.fromEntries(queryParams)  //{name:'why',age:20,height:1.88}


trimeStart trimeEnd 去除前后空格

trim()会去除前后的空格

bigInt基于大数

const bigInt = 900000000000000000001n  //以n结尾
//如果需要加一个小数 bigInt +10   //不太安全,需要将10转换为bigInt型
bigInt + 10n 才可

Nullish Coalescing Operator 空值合并运算??

//当??前的值为undefined或null时使用??后的值,否则使用??前的值
const foo = 0
const bar = foo || '1'   //最终为1
const baz = foo ?? '1'   //最终为0

Optional Chaining 可选链 ?.

?.前的不为undefined或null时,执行.之后的语法,不会造成后续代码的不执行

Global This

console.log(globalThis)  //在不同环境下显示不同  node与浏览器中的全局对象不同

ES12 FinalizationRegistry

//在某个对象被销毁时执行
const finalRegistry = new FinalizationRegistry(()=>{
    console.log('注册在finalRegistry中的对象某一个被销毁了')
})
let obj = {}
finalRegistry.register(obj)  //注册的时候可以进行传递第二个参数为自己的标识
obj =null   //GC不是立即回收,在一段时候后执行final的回调函数

WeakRef 弱引用

const finalRegistry = new FinalizationRegistry(()=>{
    console.log('注册在finalRegistry中的对象某一个被销毁了')
})
let obj = {}
let info = new WearRef(obj)
finalRegistry.register(obj)  
obj =null   
console.log(info.deref())  
//如果在obj指向null时,gc还没有进行回收,则可以访问,如果已经被销毁,则为undefined

logical assingn operator逻辑赋值运算

let message = undefined
message = message || 'Default'
//与下面的等价
message ||= 'Default'

message &&= '为真使用我'

message ??= 'Default'  //当message为undefined或null时将后面的赋值给message