聊聊JS解構的5個有趣使用方法

2022-10-24 22:00:15
本篇文章帶大家聊聊JavaScript解構(Destructuring)的5個有趣用法,希望給大家有所幫助!

前端(vue)入門到精通課程:進入學習
Apipost = Postman + Swagger + Mock + Jmeter 超好用的API偵錯工具:

1. 交換變數(Swap variables)

交換2個變數的的常用做法是需要一個額外的臨時變數,來看一個簡單的場景:

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

temp = a;
a = b;
b = temp;

a; // => 2
b; // => 1
登入後複製

temp是一個臨時變數,它儲存a的值,然後將b的值賦給a,最後再把temp中儲存的a的值賦給b,完成了交換。
解構賦值使變數交換更簡單,不需要顯式建立臨時變數:

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. 存取陣列項(Access array item)

你有一個可能為空的陣列。你希望存取陣列的第1個、第2個或第n個元素,但如果該元素不存在,則獲取一個預設值。
通常你會使用陣列的長度屬性:

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'
登入後複製

注意解構左邊的逗號:它表示忽略第一個元素。secondColorcolors陣列中索引1處的元素賦值。

3. 不變的操作(Immutable operations)

當我開始使用React和後來的Redux時,我被迫編寫了一些涉及不可變性的程式碼(這裡的意思是保持原物件不變)。雖然一開始有些困難,但後來我看到了它的好處:更容易處理單向資料流
不變性是指禁止改變物件。幸運的是,解構可以幫助你輕鬆地以不可變的方式實現某些操作。
解構與rest操作符(...)結合來刪除陣列的第一個元素:

const numbers = [1, 2, 3];

const [, ...fooNumbers] = numbers;

fooNumbers; // => [2, 3]
numbers; // => [1, 2, 3]
登入後複製

[, ...fooNumbers] = numbers解構,建立了一個新的陣列fooNumbers,它包含了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' }
登入後複製

解構賦值與物件rest操作符相結合,建立一個新物件small,它包含了big物件中除foo屬性外的所有屬性。

4. 解構可迭代物件(Destructuring iterables)

在前面的小節中,對陣列應用瞭解構。但是你可以對任何實現可迭代協定(iterable protocol)的物件進行解構。
許多原生基本型別和物件都是可迭代的:陣列(arrays)、字串(string)、類陣列(typed arrays)、集合(set)和對映(map)。
例如,你可以把一個字串解構成幾個字元:

const str = 'cheese';

const [firstChar = ''] = str;

firstChar; // => 'c'
登入後複製

你並不用侷限於原生的型別,通過實現可迭代協定,可以客製化解構邏輯。
movies包含一個movie物件的列表。在解構movies時,將電影標題作為字串來獲取是非常棒的。讓我們實現一個自定義迭代器:

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來實現可迭代協定。迭代器的方法:迭代電影的標題。
遵循迭代協定允許將movies物件解構為標題,獲取第一部電影標題的具體方法是:const [firstMovieTitle] = movies

5. 解構動態屬性(Destructuring dynamic properties)

根據我的經驗,通過屬性對物件進行解構比陣列解構更常見。物件的解構看起來很簡單:

const movie = { title: 'Heat' };

const { title } = movie;

title; // => 'Heat'
登入後複製

const {title} = movie建立一個變數title,並將屬性movie.title的值賦給它。
當我第一次讀到物件解構時,我有點驚訝於你不必靜態地知道屬性名,你可以使用動態屬性名稱來解構物件!

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

greet({ name: 'Batman' }, 'name'); // => 'Hello, Batman!'
greet({ }, 'name'); // => 'Hello, Unknown!'
登入後複製

greet()函數有兩個引數:物件和屬性名。在greet()函數內部,解構賦值const {[nameProp]: name = 'Unknown'} = obj使用中括號[nameProp]讀取動態屬性名,name變數作為別名接收動態屬性值。如果屬性不存在,你還可以給它賦一個預設值Unknown

6. 總結

如果你想存取物件屬性和陣列元素,那麼解構非常有用。
在基本用法之上,陣列解構便於交換變數、存取陣列項、執行一些不可變的操作。
JavaScript提供了更大的可能性,因為你可以使用迭代器定義自定義的解構邏輯。

本文翻譯自:5 Interesting Uses of JavaScript Destructuring

地址:https://dmitripavlutin.com/5-interesting-uses-javascript-destructuring/

【相關推薦:、】

以上就是聊聊JS解構的5個有趣使用方法的詳細內容,更多請關注TW511.COM其它相關文章!