<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          4個強大JavaScript運算符

          共 5793字,需瀏覽 12分鐘

           ·

          2021-03-27 18:12


          作者 | Anthony Jimenez
          譯者 | 吳留坡
          策劃 | 田曉旭
          來源 | 前端之巔
          今天我們學習新的 JS 運算符!

          你有沒有花一個下午的時間閱讀 Mozilla 文檔?如果有,你會發(fā)現(xiàn)網(wǎng)上有很多 JS 資料,這使我們很容易忽略那些更為基礎的 JS 運算符。

          這些運算符不常見但很強大!在語法上看起來很相似,作用卻不一樣,一定要仔細閱讀。

          1. ?? 非空運算符
          在 JS 中,?? 運算符被稱為非空運算符。如果第一個參數(shù)不是 null/undefined(譯者注:這里只有兩個假值,但是 JS 中假值包含:未定義 undefined、空對象 null、數(shù)值 0、空數(shù)字 NaN、布爾 false,空字符串'',不要搞混了),將返回第一個參數(shù),否則返回第二個參數(shù)。比如,
          null ?? 5 // => 5
          3 ?? 5 // => 3
          給變量設置默認值時,以前常用 ||邏輯或運算符,例如,
          var prevMoney = 1
          var currMoney = 0
          var noAccount = null
          var futureMoney = -1
          function moneyAmount(money) {
          return money || `賬戶未開通`
          }
          console.log(moneyAmount(prevMoney)) // => 1
          console.log(moneyAmount(currMoney)) // => 賬戶未開通
          console.log(moneyAmount(noAccount)) // => 賬戶未開通
          console.log(moneyAmount(futureMoney)) // => -1
          上面我們創(chuàng)建了函數(shù) moneyAmount,它返回當前用戶余額。我們使用 || 運算符來識別沒有帳戶的用戶。然而,當用戶沒有帳戶時,這意味著什么?將無賬戶視為空而不是 0 更為準確,因為銀行賬戶可能沒有(或負)貨幣。在上面的例子中,|| 運算符將 0 視為一個虛假值,不應該包括用戶有 0 美元的帳戶。讓我們使用?? 非空運算符來解決這個問題:
          var currMoney = 0
          var noAccount = null
          function moneyAmount(money) {
            return money ?? `賬戶未開通`
          }
          moneyAmount(currMoney) // => 0
          moneyAmount(noAccount) // => `賬戶未開通`

          概括地說 ?? 運算符允許我們在忽略錯誤值(如 0 和空字符串)的同時指定默認值。

          2. ??= 空賦值運算符
          ??= 也被稱為空賦值運算符,與上面的非空運算符相關。看看它們之間的聯(lián)系:

          var x = null
          var y = 5
          console.log(x ??= y) // => 5
          console.log(x = (x ?? y)) // => 5

          僅當值為 null 或 undefined 時,此賦值運算符才會賦值。上面的例子強調(diào)了這個運算符本質(zhì)上是空賦值的語法糖(譯者注,類似的語法糖:a = a + b 可寫成 a += b )。接下來,讓我們看看這個運算符與默認參數(shù)(譯者注,默認參數(shù)是 ES6 引入的新語法,僅當函數(shù)參數(shù)為 undefined 時,給它設置一個默認值)的區(qū)別:
          function gameSettingsWithNullish(options) {
            options.gameSpeed ??= 1
            options.gameDiff ??= 'easy' 
            return options
          }
          function gameSettingsWithDefaultParams(gameSpeed=1, gameDiff='easy') {
            return {gameSpeed, gameDiff}
          }
          gameSettingsWithNullish({gameSpeed: null, gameDiff: null}) // => {gameSpeed: 1, gameDiff: 'easy'}
          gameSettingsWithDefaultParams(undefined, null) // => {gameSpeed: null, gameDiff: null}

          上述函數(shù)處理空值的方式有一個值得注意的區(qū)別。默認參數(shù)將用空參數(shù)(譯者注,這里的空參數(shù),只能是 undefined)覆蓋默認值,空賦值運算符將不會。默認參數(shù)和空賦值都不會覆蓋未定義的值。更多:

          https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Logical_nullish_assignment

          3. ?. 鏈判斷運算符
          鏈判斷運算符?. 允許開發(fā)人員讀取深度嵌套在對象鏈中的屬性值,而不必驗證每個引用。當引用為空時,表達式停止計算并返回 undefined。比如:
          var travelPlans = {
            destination: 'DC',
            monday: {
              location: 'National Mall',
              budget: 200
            }
          }
          console.log(travelPlans.tuesday?.location) // => undefined
          現(xiàn)在,把我們剛剛學到的結(jié)合起來,把 tuesday 加入旅行計劃中!
          function addPlansWhenUndefined(plans, location, budget) {
            if (plans.tuesday?.location == undefined) {
              var newPlans = {
                plans,
                tuesday: {
                  location: location ?? "公園",
                  budget: budget ?? 200
                },
              }
            } else {
              newPlans ??= plans; // 只有 newPlans 是 undefined 時,才覆蓋
              console.log("已安排計劃")
            }
            return newPlans
          }
          // 譯者注,對象 travelPlans 的初始值,來自上面一個例子
          var newPlans = addPlansWhenUndefined(travelPlans, "Ford 劇院", null)
          console.log(newPlans)
          // => { plans:
          // { destination: 'DC',
          // monday: { location: '國家購物中心', budget: 200 } },
          // tuesday: { location: 'Ford 劇院', budget: 200 } }
          newPlans = addPlansWhenUndefined(newPlans, null, null)
          // logs => 已安排計劃
          // returns => newPlans object

          上面的例子包含了我們到目前為止所學的所有運算符。現(xiàn)在我們已經(jīng)創(chuàng)建了一個函數(shù),該函數(shù)將計劃添加到當前沒有嵌套屬性的對象 tuesday.location 中。我們還使用了非空運算符來提供默認值。此函數(shù)將錯誤地接受像“0”這樣的值作為有效參數(shù)。這意味著 budget 可以設置為零,沒有任何錯誤。

          4. ?: 三元運算符
          ?: 又叫條件運算符,接受三個運算數(shù):條件 ?  條件為真時要執(zhí)行的表達式 : 條件為假時要執(zhí)行的表達式。實際效果:
          function checkCharge(charge) {
            return (charge > 0) ? '可用' : '需充值' 
          }
          console.log(checkCharge(20)) // => 可用
          console.log(checkCharge(0)) // => 需充值
          如果你寫過 JS,可能見過三元運算符。但是,你知道三元運算符可以用于變量賦值嗎?
          var budget = 0
          var transportion = (budget > 0) ? '火車' : '步行' 
          console.log(transportion) // => '步行'
          我們甚至可以用它來實現(xiàn)空賦值的行為:
          var x = 6
          var x = (x !== null || x !== undefined) ? x : 3
          console.log(x) // => 6
          讓我們通過創(chuàng)建一個函數(shù)來概括這個運算:
          function nullishAssignment(x,y) {
            return (x == null || x == undefined) ? y : x
          }
          nullishAssignment(null, 8) // => 8
          nullishAssignment(4, 8) // => 4
          在結(jié)束之前,讓我們使用三元運算符重構(gòu)前面示例中的函數(shù):
          function addPlansWhenUndefined(plans, location, budget) {
           var newPlans =
             plans.tuesday?.location === undefined
               ? {
                   plans,
                   tuesday: {
                     location: location ?? "公園",
                     budget: budget ?? 200
                   },
                 }
               : console.log("已安排計劃");
           newPlans ??= plans;
           return newPlans;
          }
              結(jié)論    

          我們現(xiàn)在已經(jīng)學習了這些運算符的使用方法,在這里有更多關于這些運算符的知識。

          https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators

          (譯者注:文中前三個運算符是 ES2020 的新特性,請勿直接用在生產(chǎn)環(huán)境, 可使用 webpack+babel 進行轉(zhuǎn)義,解決瀏覽器兼容性問題)

           延伸閱讀
          https://medium.com/javascript-in-plain-english/4-powerful-javascript-operators-youve-never-heard-of-487df37114ad
          ??愛心三連擊

          1.看到這里了就點個在看支持下吧,你的點贊在看是我創(chuàng)作的動力。

          2.關注公眾號程序員成長指北,回復「1」加入高級前端交流群!「在這里有好多 前端 開發(fā)者,會討論 前端 Node 知識,互相學習」!

          3.也可添加微信【ikoala520】,一起成長。

          “在看轉(zhuǎn)發(fā)”是最大的支持

          瀏覽 35
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  美女操逼的网站 | 欧美日韩中文视频 | 欧美精品久久 | 啪啪啪网站在线观看 | 日本中文字幕播放 |