溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

JavaScript中Destructuring的使用示例

發(fā)布時間:2020-12-01 10:30:55 來源:億速云 閱讀:140 作者:小新 欄目:web開發(fā)

小編給大家分享一下JavaScript中Destructuring的使用示例,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

JavaScript中5種有趣的解構(gòu)用法。

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。

如果使用解構(gòu)的方式會更簡單,不需要什么鬼的 temp 變量。

let a = 1;
let b = 2;

[a, b] = [b, a];

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

[a,b] = [b,a]是解構(gòu)賦值,右邊,創(chuàng)建了一個數(shù)組[b, a],即[2,1]。這個數(shù)組2被賦值了給a,1被賦值給了b

雖然這種方式也創(chuàng)建了臨時數(shù)組,但這種方式給看起來至少更簡潔,使用解構(gòu)咱們還可以交換2個以上的變量。

let zero = 2;
let one = 1;
let two = 0;

[zero, one, two] = [two, one, zero];

zero; // => 0
one;  // => 1
two;  // => 2

2. 訪問數(shù)組中元素

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

通常會使用數(shù)組的length屬性來判斷

const colors = [];

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

firstColor; // => 'white'

使用數(shù)組解構(gòu),可以更簡潔的實現(xiàn)同樣的效果:

const colors = [];

const [firstColor = 'white'] = colors;

firstColor; // => 'white'

const [firstColor = 'white'] = colors 解構(gòu)將colors數(shù)組的第一個元素賦給firstColor變量。如果數(shù)組在索引0處沒有任何元素,則分配“white”默認值。

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

const colors = [];

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

secondColor; // => 'black'

注意解構(gòu)左側(cè)的逗號:它表示忽略第一個元素,secondColor使用colors數(shù)組中索引為1的元素進行賦值。

3.不可變操作

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

不變性要求不能改變原始對象。幸運的是,解構(gòu)可以以不可變的方式輕松實現(xiàn)某些操作。

const numbers = [1, 2, 3];

const [, ...fooNumbers] = numbers;

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

解構(gòu) [, ... fooNumbers] = numbers創(chuàng)建一個新的數(shù)組fooNumbersfooNumbers 包含 numbers 元素,除了第一個元素。

numbers 數(shù)組沒有發(fā)生變化,保持操作不變性。

以同樣不可變的方式,可以從對象中刪除屬性,接著試著從對象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.解構(gòu) iterables

在前面幾個例子中,對數(shù)組使用了解構(gòu),但是咱們可以對任何實現(xiàn)可迭代協(xié)議( iterable protocol)的對象進行解構(gòu)。

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

如果不想局限于基本類型,通過實現(xiàn)可迭代協(xié)議,可以定制解構(gòu)邏輯。

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

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方法來實現(xiàn)可迭代協(xié)議,迭代器迭代title。

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

5.解構(gòu)動態(tài)屬性

根據(jù)經(jīng)驗,通過屬性對對象進行解構(gòu)比數(shù)組解構(gòu)更常見。

對象的解構(gòu)看起來很更簡單:

const movie = { title: 'Heat' };

const { title } = movie;

title; // => 'Heat'

const {title} = movie創(chuàng)建一個變量title,并將屬性movie.title的值賦給它。

到對象解構(gòu)時,我有點驚訝于咱們不必靜態(tài)地知道屬性名,可以使用動態(tài)屬性名稱來解構(gòu)對象。

為了了解動態(tài)解構(gòu)如何工作的,編寫一個greet函數(shù):

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

greet({ name: 'Batman' }, 'name'); // => 'Hello, Batman!'
greet({ }, 'name'); // => 'Hello, Unknown!'

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

greet()內(nèi)部,解構(gòu)賦值const {[nameProp]:name ='Unknown'} = obj使用方括號的形式 [nameProp]讀取動態(tài)屬性名稱,name變量接收動態(tài)屬性值。

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

以上是“JavaScript中Destructuring的使用示例”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學習更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI