這篇文章帶大家聊聊JavaScript解構(Destructuring)的5個有趣用法,希望給大家有幫助!
交換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
你可以交換任意多的變量!不過,交換兩個變數是最常見的場景。
你有一個可能為空的陣列。你希望存取數組的第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'
注意解構左邊的逗號:它表示忽略第一個元素。 secondColor
由colors
陣列中索引1處的元素賦值。
#當我開始使用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
屬性外的所有屬性。
在前面的小節中,對陣列應用了解構。但是你可以對任何實作可迭代協定(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
。
根據我的經驗,透過屬性對物件進行解構比陣列解構更常見。物件的解構看起來很簡單:
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
。
如果你想访问对象属性和数组元素,那么解构非常有用。
在基本用法之上,数组解构便于交换变量、访问数组项、执行一些不可变的操作。
JavaScript提供了更大的可能性,因为你可以使用迭代器定义自定义的解构逻辑。
本文翻译自:5 Interesting Uses of JavaScript Destructuring
地址:https://dmitripavlutin.com/5-interesting-uses-javascript-destructuring/
【相关推荐:javascript视频教程、编程视频】
以上是聊聊JS解構的5個有趣使用方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!