ES6及以上常用

本文介绍了JavaScriptES6和ES7的一些关键特性,包括使用`import*as`导入模块,扩展运算符在合并对象和数组中的应用,解构赋值对对象和数组的操作,模板字符串的灵活性,以及可选链操作符和空值合并运算符在处理潜在null或undefined时的用法。此外,还详细讲解了async/await如何简化异步编程和Promise的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import * as xxx from "yyy"

import * as xxx from "yyy"会把 "yyy"文件里导出的所有内容包裹在一个xxx对象里,以达到简化引入的目的,如:

//yyy路径下的文件
//状态
export const videoOptions = [
    {
        label: '免费',
        value: '0'
    },
    {
        label: '商用',
        value: '1'
    }
]
//方法
export const publicMethods = () => {
    console.log('ES6')
}

引入:import * as myObj from "文件路径"

使用:myObj.videoOptions 或者myObj.publicMethods()

二、扩展运算符

合并对象、数组等

const baseParams = {
    page:1,
    rows:20
}
const searchForm = {
    id:10086,
    name:"张三"
}
//合并参数(属性名重复的话,后者覆盖前者)  
const params = {...searchForm,...baseParams} //此时的baseParams为后者

//Object.assign()也可以合并对象,第一个参数为目标对象,第二个及后面的对象的属性都会加到目标对象中去,目标对象即为合并后的结果(属性名重复的话,后者覆盖前者)
const obj1 = Object.assign(baseParams,searchForm)//会改变baseParams的值
//console.log(obj1 === baseParams) //true
const obj2 = Object.assign({},baseParams,searchForm)//不会改变baseParams的值
三、解构赋值
//对象解构(根据对象的属性名解构,不受顺序影响)
const res = {
    code:1000,
    data:[{status:1,public:"已发布"}],
    totalCount:100
}
const {code,data = [],totalCount = 0} = res 

//数组解构(按顺序解构,受解构顺序影响)
const list = [
    {name:"一二",age:18},
    {name:"布布",age:19}
]
const [a,b] = list
//a  {name:"一二",age:18}    b {name:"布布",age:19}
//结合扩展运算符解构数组
const myList = [
    {name:"一二",age:18},
    {name:"布布",age:19},
    {name:"樱樱",age:17}
]
const [c,...d] = myList
//console.log(c)  {name:"一二",age:18}
//console.log(d)  [ {name:"布布",age:19},{name:"樱樱",age:17}]
四、模板字符串
//模板字符串相比普通字符串更加灵活,用``号,变量书写在${}里
const myName = "一二"
const str = `my name is ${myName}`
//console.log(str)  my name is 一二
五、可选链操作符(?.)

可选链操作符( ?. )允许读取位于连接对象链深处的属性的值,而不必明确验证链中的每个引用是否有效。?. 操作符的功能类似于 . 链式操作符,不同之处在于,可选链操作符在引用为空 (null 或者 undefined) 的情况下不会抛出错误,该表达式短路返回值是 undefined。与函数调用一起使用时,如果给定的函数不存在,则返回 undefined。

通俗来讲 就是如果要获取到数据层级较深的某个值时,使用可选链可以简化判断。存在即返回对应的值,不存在则返回undefined。

const res = {
    code:1000,
    data:{
        records:{
            userList:[1,2,3]
        },
        getName:()=>{
            console.log(this)
        }
    }
}
//假设此处的data和recordsh和getName()不确定,有可能为null或者undefined
//想要使用userlist属性 以前的写法:
if( res.data && res.data.records ){
    console.log(res.data.records.userList)
}
//可选链操作符写法,向深处取值时在可能为null或者undefined的属性后面加?号
if(res.data?.records?.userList){
    console.log(res.data.records.userList)
}
//使用getName()方法
res.data?.getName?.()
六、空值合并运算符(??)

读取对象属性的时候,如果某个属性的值是nullundefined,有时候需要为它们指定默认值。常见做法是通过||运算符指定默认值。

const text = response.data.text || "hello world"
const time = response.data.time || 100
const isPbulic = response.data.isPublic || true
//本意是只要属性的值为null或undefined,默认值就会生效,但是属性的值如果为空字符串或0或false,默认值也会生效,显然是不对的。
//使用空值合并运算符(??)就不会出现这种情况,它的行为类似||,但是只有左侧读取属性的值为null或undefined的时候才会使用??运算符后面的默认值
const hasPermission = response.data.permission ?? true //若左侧为false则使用false,此时默认值不生效
七、ES7之async/await

async用于声明一个异步函数,表示该函数的执行不会阻塞函数体外的代码;

await可理解为 "等待",await用于等待一个promise实例对象,需要注意的是await必须在async声明的异步函数内使用,否则会报错。

await会暂停当前异步函数内部await表达式以下语句的执行,只有await等待的promise实例对象返回结果后才会执行await以下的代码,若不返回结果,await以下的语句将不会执行。

async function fun(){
    console.log(1)
    const result = await new Promise((resolve,reject)=>{
        setTimeout(()=>{
            console.log(2)
            //resolve("10086")
        },1000)
    })
    console.log(3)
}
//调用异步函数
fun()  // 1 2   promise实例对象里未返回结果,因此 3不输出

若 Promise 正常处理(fulfilled),其回调的resolve函数参数作为 await 表达式的值,继续执行 async function,若 Promise 处理异常(rejected),await 表达式会把 Promise 的异常原因抛出,使用try/catch来捕获异常。如果 await 操作符后的表达式的值不是一个 Promise实例对象,那么该值将被转换为一个已正常处理的 Promise。

async function func(){
    const res = await new Promise((resolve,reject)=>{
        setTimeout(()=>{
            resolve("正常")
        },1000)
    })
    console.log(res)  // 正常
}
func()

//捕获异常
async function func2(){
    try{
        const r = await new Promise((resolve,reject)=>{
            setTimeout(()=>{
                reject("异常")
            },1000)
        })
    }catch(err){
        console.log(err) // 异常
    }
}

通常使用async/await来代替 promise的链式调用,看起来更简洁

myMethod(){
    try{
        const params = {}
        const res = await myAPI(params)//接口请求
        if(res.code === 1000){
         //code
        }else{
         //提示后台返回的错误信息
        }
    }catch(err){
        //捕获接口请求错误信息
    }    
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值