• 浅析3个生僻但强大的JavaScript操作符


      你有没有花一个下午的时间来阅读Mozilla的文档?如果你有,你就会很清楚,网上有很多关于JavaScript的信息。这使得人们很容易忽视一些比较生僻的JavaScript操作符。然而,这些操作符不常见并不意味着它们不强大! 它们各自在语法上看起来很相似,但一定要读懂每一个,因为它们的工作方式不同。就让我们一探究竟吧!

    1、?? 操作符

      在JavaScript中,??运算符被称为nullish coalescing运算符(零合并操作符)。如果第一个参数不是null/undefined,这个运算符将返回第一个参数,否则,它将返回第二个参数。我们来看一个例子。

    null ?? 5   // 5
    3 ?? 5     // 3
    0 ?? 5     // 0
    
    // 与或的区别
    0 || 5   // 5
    null || 5  // 5

      当为一个变量分配默认值时,JavaScript开发人员传统上依赖逻辑OR运算符,比如这样。

    '' ?? 5    // ""
    '' || 5    // 5

      在上面的例子中,|| 操作符将 0及空 视为一个假值,因此会返回后面的默认值。

      但是实际情况下,我们还是需要仅仅当前面为 null或undefined 的时候,才取后面的值;当为 0或空 时,仍取前面的值。这个时候,我们使用nullish coalescing操作符就可以很好的解决这个问题。

      概括地说,??运算符允许我们分配默认值,同时忽略0和空字符串等错误值。

    2、??= 操作符

      ??=又被称为逻辑空值赋值运算符,与我们之前学习的内容密切相关。我们来看看它们是如何联系在一起的。

    var x = null;
    var y = 5;
    x ??= y;
    x
    // 5
    
    var x = 3;
    var y = 5;
    x ??= y;
    x
    // 3
    x ??= y
    //
    x = (x ?? y)

      这个赋值操作符只有在当前值为 null 或 未定义undefined 的情况下才会赋一个新的值。上面的例子强调了这个操作符本质上是空值赋值的语法糖。接下来,让我们看看这个操作符与默认参数有何不同。

    function gameSettingsWithNullish (options) {
        options.gameSpeed ??= 1
        options.gameDiff ??= 'easy'
        return options
    }
    function gameSettingsWithDefaultParams (gameSpeed = 1, gameDiff = 'easy') {
        return {gameSpeed, gameDiff}
    }
    gameSettingsWithNullish({gameSpeed:null, gameSpeed:null})
    // {gameSpeed: 1, gameDiff: "easy"}
    gameSettingsWithNullish({})
    // {gameSpeed: 1, gameDiff: "easy"}
    gameSettingsWithDefaultParams(null, null) // {gameSpeed: null, gameDiff: null} gameSettingsWithDefaultParams() // {gameSpeed: 1, gameDiff: "easy"}
    gameSettingsWithDefaultParams(undefined, undefined)
    // {gameSpeed: 1, gameDiff: "easy"}
    gameSettingsWithDefaultParams(0, 0)
    // {gameSpeed: 0, gameDiff: 0}

    3、?. 操作符

      可选的链式操作符 ?. 允许开发人员读取深嵌在对象链中的属性值,而不必显式验证每个引用。当一个引用为空时,表达式停止计算并返回一个未定义的值。让我们来看看一个例子。

    var travelPlans = {
      destination:'DC',
      monday:{
        location:'National Mall',
        budget:200
      }
    }
    var tuesdayPlans = travelPlans.tuesday.location;
    // 报错:VM4480:8 Uncaught TypeError: Cannot read property 'location' of undefined
        at <anonymous>:8:40
    
    // 为防止报错,我们通常这样写
    var tuesdayPlans = travelPlans.tuesday && travelPlans.tuesday.location;
    // undefined

      那么现在我们就可以这样写

    var tuesdayPlans = travelPlans.tuesday?.location;  // undefined
    
    var travelPlans = {
      destination:'DC',
      monday:{
        location:'National Mall',
        budget:200
      },
      tuesday:{
        location:'test'
      }
    }
    travelPlans.tuesday?.location // "test"
  • 相关阅读:
    我的架构经验系列文章 前端架构
    我的架构经验系列文章 后端架构 安全层面
    Adhesive框架系列文章报警服务模块使用和实现
    Adhesive框架系列文章Mongodb数据服务模块实现(上)
    在Silverlight程序中使用Thread一个很容易被忽略的问题
    .net(偏web) vs j2ee的一些框架选型
    Wcf扩展
    Adhesive框架系列文章内存队列服务模块使用和实现
    【翻译】C#编程语言和JAVA编程语言的比较(下)
    在测试Adhesive的时候发现一个Mongodb官方驱动1.1.0.4184比较严重的BUG
  • 原文地址:https://www.cnblogs.com/goloving/p/14008373.html
Copyright © 2020-2023  润新知