5個 JS 解構有趣的用途

来源:https://www.cnblogs.com/fundebug/archive/2019/08/24/5-interesting-uses-javascript-destructuring.html
-Advertisement-
Play Games

摘要: 玩轉ES6解構賦值。 原文: "5個 JS 解構有趣的用途" 譯者:前端小智 1. 交換變數 通常交換兩個變數的方法需要一個額外的臨時變數,來看看例子: 是一個臨時變數,它先保存 的值。然後把 的值賦值給 ,接著將 值賦給 。 如果使用解構的方式會更簡單,不需要什麼鬼的 變數。 是解構賦值, ...


摘要: 玩轉ES6解構賦值。

1. 交換變數

通常交換兩個變數的方法需要一個額外的臨時變數,來看看例子:

    let a = 1;
    let b = 2;
    let temp;
    
    temp = a;
    a = b;
    b = temp;
    
    a; // => 2
    b; // => 1

temp是一個臨時變數,它先保存a的值。然後把b的值賦值給a,接著將temp值賦給 b

如果使用解構的方式會更簡單,不需要什麼鬼的 temp 變數。

    let a = 1;
    let b = 2;
    
    [a, b] = [b, a];
    
    a; // => 2
    b; // => 1

[a,b] = [b,a]是解構賦值,右邊,創建了一個數組[b, a],即[2,1]。這個數組2被賦值了給a,1被賦值給了b

雖然這種方式也創建了臨時數組,但這種方式給看起來至少更簡潔,使用解構咱們還可以交換2個以上的變數。

    let zero = 2;
    let one = 1;
    let two = 0;
    
    [zero, one, two] = [two, one, zero];
    
    zero; // => 0
    one;  // => 1
    two;  // => 2

2. 訪問數組中元素

有種場景,咱們可能有一個為空的項數組。並且希望訪問數組的第一個、第二個或第n個項,但如果該項不存在,則使用指定預設值。

通常會使用數組的length屬性來判斷

    const colors = [];
    
    let firstColor = 'white';
    if (colors.length > 0) {
     firstColor = colors[0];
    }
    
    firstColor; // => 'white'

使用數組解構,可以更簡潔的實現同樣的效果:

    const colors = [];
    
    const [firstColor = 'white'] = colors;
    
    firstColor; // => 'white'

const [firstColor = 'white'] = colors 解構將colors數組的第一個元素賦給firstColor變數。如果數組在索引0處沒有任何元素,則分配“white”預設值。

當然還可以更靈活,如果只想訪問第二個元素,可以這麼做。

    const colors = [];
    
    const [, secondColor = 'black'] = colors;
    
    secondColor; // => 'black'

註意解構左側的逗號:它表示忽略第一個元素,secondColor使用colors數組中索引為1的元素進行賦值。

3. 不可變操作

當我開始使用ReactRedux時,被迫編寫了一些遵守不可變性的代碼。雖然一開始有些困難,但後來我看到了它的好處:更容易處理單向數據流。

不變性要求不能改變原始對象。幸運的是,解構可以以不可變的方式輕鬆實現某些操作。

    const numbers = [1, 2, 3];
    
    const [, ...fooNumbers] = numbers;
    
    fooNumbers; // => [2, 3]
    numbers; // => [1, 2, 3]

解構 [, ... fooNumbers] = numbers創建一個新的數組fooNumbersfooNumbers 包含 numbers 元素,除了第一個元素。

numbers 數組沒有發生變化,保持操作不變性。

以同樣不可變的方式,可以從對象中刪除屬性,接著試著從對象big中刪除foo屬性:

    const big = {
     foo: 'value Foo',
     bar: 'value Bar'
    };
    
    const { foo, ...small } = big;
    
    small; // => { bar: 'value Bar' }
    big; // => { foo: 'value Foo', bar: 'value Bar' }

4. 解構 iterables

在前面幾個例子中,對數組使用瞭解構,但是咱們可以對任何實現可迭代協議( iterable protocol)的對象進行解構。

許多原生基本類型和對象都是可迭代的: array, string, typed arrays, setmap

如果不想局限於基本類型,通過實現可迭代協議,可以定製解構邏輯。

movies包含一個movie對象列表。在解構movies時,將title作為字元串獲取是非常棒的。讓咱們實現一個自定義迭代器。

    const movies = {
      list: [
        { title: 'Heat' }, 
        { title: 'Interstellar' }
      ],
      [Symbol.iterator]() {
        let index = 0;
        return {
          next: () => {
            if (index < this.list.length) {
              const value = this.list[index++].title;
              return { value, done: false };
            }
            return { done: true };
          }
        };
      }
    };
    
    const [firstMovieTitle] = movies;
    console.log(firstMovieTitle); // => 'Heat'

movies對象通過定義Symbol.iterator方法來實現可迭代協議,迭代器迭代title

遵循iterable協議允許將movies對象分解為title,具體方法是讀取第一個moviestitle:const [firstMovieTitle] = movies

5. 解構動態屬性

根據經驗,通過屬性對對象進行解構比數組解構更常見。

對象的解構看起來很更簡單:

    const movie = { title: 'Heat' };
    
    const { title } = movie;
    
    title; // => 'Heat'

const {title} = movie創建一個變數title,並將屬性movie.title的值賦給它。

到對象解構時,我有點驚訝於咱們不必靜態地知道屬性名,可以使用動態屬性名稱來解構對象。

為了瞭解動態解構如何工作的,編寫一個greet函數:

    function greet(obj, nameProp) {
     const { [nameProp]: name = 'Unknown' } = obj;
     return `Hello, ${name}!`;
    }
    
    greet({ name: 'Batman' }, 'name'); // => 'Hello, Batman!'
    greet({ }, 'name'); // => 'Hello, Unknown!'

使用2個參數調用greet() 函數:對象和屬性名稱。

greet()內部,解構賦值const {[nameProp]:name ='Unknown'} = obj使用方括弧的形式 [nameProp]讀取動態屬性名稱,name變數接收動態屬性值。

更好的做法是,如果屬性不存在,可以指定預設值“Unknown”。

代碼部署後可能存在的BUG沒法實時知道,事後為瞭解決這些BUG,花了大量的時間進行log 調試,這邊順便給大家推薦一個好用的BUG監控工具 Fundebug

原文:https://dmitripavlutin.com/5-interesting-uses-javascript-destructuring/

關於Fundebug

Fundebug專註於JavaScript、微信小程式、微信小游戲、支付寶小程式、React Native、Node.js和Java線上應用實時BUG監控。 自從2016年雙十一正式上線,Fundebug累計處理了20億+錯誤事件,付費客戶有陽光保險、核桃編程、荔枝FM、掌門1對1、微脈、青團社等眾多品牌企業。歡迎大家免費試用


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 最近博客背景圖片的外鏈掛了,沒辦法,只好另找辦法。 在博客園後臺,有一個“文件”菜單,可以上傳自己的文件,我就打算把圖片傳到裡面。但卻發現了一個很反人性的設置:不允許上傳jpg,png文件,允許上傳的只有bmp,gif這樣的圖片文件。bmp文件太大,載入都要好幾秒,gif文件質量太差,只有256色, ...
  • 編程思想: 面向過程:凡事親力親為,所有事情的過程都要清楚,註重的是過程。 面向對象:提出需求,找到對象,對象解決這個問題,我們要結果,註重的是結果。 面向對象的特性:封裝,繼承,多態; JS: 是一門解釋性語言,是一門腳本語言,是一門弱類型語言,是一門基於對象的語言,是一門動態類型的語言。 對象: ...
  • 一、React的世界觀1、通過改變state來改變視圖視圖不用考慮如何改變自己,把state畫出來即可。2、變數不可變通過創建一個新的state來更改state,使得變更可追蹤,不容易因為其他部分修改state導致不可預測的錯誤3、結構與樣式分離參考了CSS的做法,RN的style機制使得代碼更清晰 ...
  • js中的數組和字元串有點類似,不是說本質上,而是在遍歷,獲取時的類似。從標識來說,可以一眼看出那個是數組,那個是字元串;但在使用遍歷時,會不經意的將兩者混淆,導致方法用錯。同時兩者的方法又有好幾個相同的,但需註意語義,以及有些方法是不會對原數組產生影響的。以下是我整理的一些關於數組和字元串的一些方法 ...
  • 介紹 在css2當中,存在標準模式下的盒子模型和IE下的怪異盒子模型。這兩種方案表示的是一種盒子模型的渲染模式。而在css3當中,新增加了彈性盒子模型,彈性盒子模型是一種新增加的強大的、靈活的佈局方案。彈性盒子模型是css3中新提出的一種佈局方案。是一種為了應對針對不同屏幕寬度不同設備的一整套新的布 ...
  • 一、什麼是 iframe iframe 用於在頁面內顯示頁面,使用 <iframe> 會創建包含另外一個文檔的內聯框架(即行內框架) 二、iframe 的常用屬性 1、width 定義 iframe 的寬度 2、height 定義 iframe 的高度 3、name 規定 iframe 的名稱 4、 ...
  • HTML5/CSS簡介 首先來說一說什麼是HTML5,HTML5可以認為是字面上的意義,也就是HTML的第五代產品,當然從另一個角度來說它是一種新的富客戶端解決方案。 HTML5 將成為 HTML、XHTML 以及 HTML DOM 的新標準。 HTML 的上一個版本誕生於 1999 年。自從那以後 ...
  • 狀態模式 允許一個對象在其內部狀態改變時改變它的行為,對象看起來似乎修改了它的類。 簡單的解釋一下: 第一部分的意思是將狀態封裝成獨立的類,並將請求委托給當前的狀態對象,當對象的內部狀態改變時,會帶來不同的行為變化。 第二部分是從客戶的角度來看,我們使用的對象,在不同的狀態下具有截然不同的行為,這個 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 在我們開發過程中基本上不可或缺的用到一些敏感機密數據,比如SQL伺服器的連接串或者是OAuth2的Secret等,這些敏感數據在代碼中是不太安全的,我們不應該在源代碼中存儲密碼和其他的敏感數據,一種推薦的方式是通過Asp.Net Core的機密管理器。 機密管理器 在 ASP.NET Core ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 順序棧的介面程式 目錄順序棧的介面程式頭文件創建順序棧入棧出棧利用棧將10進位轉16進位數驗證 頭文件 #include <stdio.h> #include <stdbool.h> #include <stdlib.h> 創建順序棧 // 指的是順序棧中的元素的數據類型,用戶可以根據需要進行修改 ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • C總結與剖析:關鍵字篇 -- <<C語言深度解剖>> 目錄C總結與剖析:關鍵字篇 -- <<C語言深度解剖>>程式的本質:二進位文件變數1.變數:記憶體上的某個位置開闢的空間2.變數的初始化3.為什麼要有變數4.局部變數與全局變數5.變數的大小由類型決定6.任何一個變數,記憶體賦值都是從低地址開始往高地 ...
  • 如果讓你來做一個有狀態流式應用的故障恢復,你會如何來做呢? 單機和多機會遇到什麼不同的問題? Flink Checkpoint 是做什麼用的?原理是什麼? ...
  • C++ 多級繼承 多級繼承是一種面向對象編程(OOP)特性,允許一個類從多個基類繼承屬性和方法。它使代碼更易於組織和維護,並促進代碼重用。 多級繼承的語法 在 C++ 中,使用 : 符號來指定繼承關係。多級繼承的語法如下: class DerivedClass : public BaseClass1 ...
  • 前言 什麼是SpringCloud? Spring Cloud 是一系列框架的有序集合,它利用 Spring Boot 的開發便利性簡化了分散式系統的開發,比如服務註冊、服務發現、網關、路由、鏈路追蹤等。Spring Cloud 並不是重覆造輪子,而是將市面上開發得比較好的模塊集成進去,進行封裝,從 ...
  • class_template 類模板和函數模板的定義和使用類似,我們已經進行了介紹。有時,有兩個或多個類,其功能是相同的,僅僅是數據類型不同。類模板用於實現類所需數據的類型參數化 template<class NameType, class AgeType> class Person { publi ...
  • 目錄system v IPC簡介共用記憶體需要用到的函數介面shmget函數--獲取對象IDshmat函數--獲得映射空間shmctl函數--釋放資源共用記憶體實現思路註意 system v IPC簡介 消息隊列、共用記憶體和信號量統稱為system v IPC(進程間通信機制),V是羅馬數字5,是UNI ...