zoukankan      html  css  js  c++  java
  • 第十节:ES11之String、Dynamic、BigInt、allSettled、globalThis、Optional chaining、Nulish coalescing Operator

    一. String扩展

     1. matchAll()方法

      matchAll() 方法返回一个包含所有匹配正则表达式及分组捕获结果的迭代器

    matchAll之前,还有exec、match、replace等

    function selectDiv(regExp, str) {
        let matches = []
        for (let match of str.matchAll(regExp)) {
            matches.push(match[1])
        }
        return matches
    }
    const res = selectDiv(regExp, str)
    console.log(res)

    二. Dynamic Import

     按需 import 提案几年前就已提出,如今终于能进入ES正式规范。这里个人理解成“按需”更为贴切。现代前端打包资源越来越大,打包成几M的JS资源已成常态,而往往前端应用初始化时根本不需要全量加载逻辑资源,为了首屏渲染速度更快,很多时候都是按需加载,比如懒加载图片等。而这些按需执行逻辑资源都体现在某一个事件回调中去加载

    const oBtn = document.querySelector('#btn')
    oBtn.addEventListener('click', () => {
        import('./ajax').then(mod => {
            // console.log(mod)
            mod.default('static/a.json', res => {
                console.log(res)
            })
        })
    })

     PS:当然,webpack目前已很好的支持了该特性。Vue中也已使用Dynamic Import实现组件的动态导入。

    三. BigInt

     在 ES11 增加了新的原始数据类型:BigInt,表示一个任意精度的整数,可以表示超长数据,可以超出2的53次方

     Js 中 Number类型只能安全的表示-(2^53-1)至 2^53-1 范的值

    使用 BigInt 有两种方式:

    方式一:数字后面增加n

    const bigInt = 9007199254740993n
    console.log(bigInt)
    console.log(typeof bigInt) // bigint
    
    console.log(1n == 1) // true
    console.log(1n === 1) // false

    方式二:使用 BigInt 函数

    const bigIntNum = BigInt(9007199254740993n)
    console.log(bigIntNum)

    四. Promise扩展

    allSettled方法

    ES11之前

      Promise.all() 具有并发执行异步任务的能力。但它的最大问题就是如果其中某个任务出现异常(reject),所有任务都会挂掉,Promise直接进入 reject 状态。

    案例:

     现在页面上有三个请求,分别请求不同的数据,如果一个接口服务异常,整个都是失败的,都无法渲染出数据

    Promise.all([
        Promise.reject({
            code: 500,
            msg: '服务异常'
        }),
        Promise.resolve({
            code: 200,
            data: ['1', '2', '3']
        }),
        Promise.resolve({
            code: 200,
            data: ['4', '5', '6']
        })
    ]).then(res => {
        console.log(res)
        console.log('成功')
    }).catch(err => {
        console.log(err)
        console.log('失败')
    })

    ES11 

      我们需要一种机制,如果并发任务中,无论一个任务正常或者异常,都会返回对应的的状态

    Promise.allSettled([
        Promise.reject({
            code: 500,
            msg: '服务异常'
        }),
        Promise.resolve({
            code: 200,
            data: ['1', '2', '3']
        }),
        Promise.resolve({
            code: 200,
            data: ['4', '5', '6']
        })
    ]).then(res => {
        console.log(res)
        // console.log('成功')
        const data = res.filter(item => item.status === 'fulfilled')
        console.log(data)
    }).catch(err => {
        console.log(err)
        console.log('失败')
    })

    五. globalThis

    1. 背景

    ES11之前获取全局对象,通常是封装一个方法来实现: 

    const getGlobal = () => {
        if (typeof self !== 'undefined') {
            return self
        }
        if (typeof window !== 'undefined') {
            return window
        }
        if (typeof global !== 'undefined') {
            return global
        }
        throw new Error('无法找到全局对象')
    }
    
    const globals = getGlobal()
    console.log(globals)

    2. ES11

      ES11中的globalThis 提供了一个标准的方式来获取不同环境下的全局 this 对象(也就是全局对象自身)。不像 window 或者 self 这些属性,它确保可以在有无窗口的各种环境下正常工作。所以,你可以安心的使用 globalThis,不必担心它的运行环境。为便于记忆,你只需要记住,全局作用域中的 this 就是 globalThis。

    console.log(globalThis)

    六. 可选链

      可让我们在查询具有多层级的对象时,不再需要进行冗余的各种前置校验。

    const user = {
        address: {
            street: 'xx街道',
            getNum() {
                return '80号'
            }
        }
    }

    ES11之前,需要做很多前置运算

    const street = user && user.address && user.address.street
    const num = user && user.address && user.address.getNum && user.address.getNum()
    console.log(street, num)

    ES11,简化代码

    const street2 = user?.address?.street
    const num2 = user?.address?.getNum?.()
    console.log(street2, num2)

    PS:可选链中的 ? 表示如果问号左边表达式有值, 就会继续查询问号后面的字段。根据上面可以看出,用可选链可以大量简化类似繁琐的前置校验操作,而且更安全。

    七. 空值合并运算符

      空值合并运算符(??)是一个逻辑运算符。当左侧操作数为 null 或 undefined 时,其返回右侧的操作数。否则返回左侧的操作数。

    ES11之前

    const b = 0 // 或者null undefined false
    const a = b || 5
    console.log(a)

    ES11

     空值合并运算符 ?? 我们仅在第一项为 null 或 undefined 时设置默认值

    // false 0  无效
    const a = b ?? 123
    console.log(a)

     

    !

    • 作       者 : Yaopengfei(姚鹏飞)
    • 博客地址 : http://www.cnblogs.com/yaopengfei/
    • 声     明1 : 如有错误,欢迎讨论,请勿谩骂^_^。
    • 声     明2 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。
     
  • 相关阅读:
    cas sso ajax的jsonp实现方案总结(新浪微薄、淘宝案例分析)
    在linux下利用nohup来后台运行java程序
    (判断)window.open()窗口被关闭后执行事件
    AngularJS开发指南14:依赖注入
    contentEditable
    AngularJS 最佳实践
    LDAP基本概念
    LDAP
    spring 配置文件中使用properties文件 配置
    【解决Jira】Chrome提示Java插件因过期而遭到阻止(JIRA上传截屏截图)
  • 原文地址:https://www.cnblogs.com/yaopengfei/p/14705632.html
Copyright © 2011-2022 走看看