javascript
解构给默认值_5个 JS 解构有趣的用途
1. 交換變量
通常交換兩個變量的方法需要一個額外的臨時變量,來看看例子:
let a = 1; let b = 2; let temp; temp = a; a = b; b = temp; a; // => 2 b; // => 1 復(fù)制代碼temp是一個臨時變量,它先保存a的值。然后把b的值賦值給a,接著將temp值賦給 b。
如果使用解構(gòu)的方式會更簡單,不需要什么鬼的 temp 變量。
let a = 1; let b = 2; [a, b] = [b, a]; a; // => 2 b; // => 1 復(fù)制代碼[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 復(fù)制代碼2. 訪問數(shù)組中元素
有種場景,咱們可能有一個為空的項(xiàng)數(shù)組。并且希望訪問數(shù)組的第一個、第二個或第n個項(xiàng),但如果該項(xiàng)不存在,則使用指定默認(rèn)值。
通常會使用數(shù)組的length屬性來判斷
const colors = []; let firstColor = 'white'; if (colors.length > 0) {firstColor = colors[0]; } firstColor; // => 'white' 復(fù)制代碼使用數(shù)組解構(gòu),可以更簡潔的實(shí)現(xiàn)同樣的效果:
const colors = []; const [firstColor = 'white'] = colors; firstColor; // => 'white' 復(fù)制代碼const [firstColor = 'white'] = colors 解構(gòu)將colors數(shù)組的第一個元素賦給firstColor變量。如果數(shù)組在索引0處沒有任何元素,則分配“white”默認(rèn)值。
當(dāng)然還可以更靈活,如果只想訪問第二個元素,可以這么做。
const colors = []; const [, secondColor = 'black'] = colors; secondColor; // => 'black' 復(fù)制代碼注意解構(gòu)左側(cè)的逗號:它表示忽略第一個元素,secondColor使用colors數(shù)組中索引為1的元素進(jìn)行賦值。
3.不可變操作
當(dāng)我開始使用React和Redux時,被迫編寫了一些遵守不可變性的代碼。雖然一開始有些困難,但后來我看到了它的好處:更容易處理單向數(shù)據(jù)流。
不變性要求不能改變原始對象。幸運(yùn)的是,解構(gòu)可以以不可變的方式輕松實(shí)現(xiàn)某些操作。
const numbers = [1, 2, 3]; const [, ...fooNumbers] = numbers; fooNumbers; // => [2, 3] numbers; // => [1, 2, 3] 復(fù)制代碼解構(gòu) [, ... fooNumbers] = numbers創(chuàng)建一個新的數(shù)組fooNumbers,fooNumbers 包含 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' } 復(fù)制代碼4.解構(gòu) iterables
在前面幾個例子中,對數(shù)組使用了解構(gòu),但是咱們可以對任何實(shí)現(xiàn)可迭代協(xié)議( iterable protocol)的對象進(jìn)行解構(gòu)。
許多原生基本類型和對象都是可迭代的: array, string, typed arrays, set 和 map。
如果不想局限于基本類型,通過實(shí)現(xiàn)可迭代協(xié)議,可以定制解構(gòu)邏輯。
movies包含一個movie對象列表。在解構(gòu)movies時,將title作為字符串獲取是非常棒的。讓咱們實(shí)現(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' 復(fù)制代碼movies對象通過定義Symbol.iterator方法來實(shí)現(xiàn)可迭代協(xié)議,迭代器迭代title。
遵循iterable協(xié)議允許將movies對象分解為title,具體方法是讀取第一個movies的title:const [firstMovieTitle] = movies。
5.解構(gòu)動態(tài)屬性
根據(jù)經(jīng)驗(yàn),通過屬性對對象進(jìn)行解構(gòu)比數(shù)組解構(gòu)更常見。
對象的解構(gòu)看起來很更簡單:
const movie = { title: 'Heat' }; const { title } = movie; title; // => 'Heat' 復(fù)制代碼const {title} = movie創(chuàng)建一個變量title,并將屬性movie.title的值賦給它。
到對象解構(gòu)時,我有點(diǎn)驚訝于咱們不必靜態(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!' 復(fù)制代碼使用2個參數(shù)調(diào)用greet() 函數(shù):對象和屬性名稱。
在greet()內(nèi)部,解構(gòu)賦值const {[nameProp]:name ='Unknown'} = obj使用方括號的形式 [nameProp]讀取動態(tài)屬性名稱,name變量接收動態(tài)屬性值。
更好的做法是,如果屬性不存在,可以指定默認(rèn)值“Unknown”。
代碼部署后可能存在的BUG沒法實(shí)時知道,事后為了解決這些BUG,花了大量的時間進(jìn)行l(wèi)og 調(diào)試,這邊順便給大家推薦一個好用的BUG監(jiān)控工具 Fundebug。
交流
干貨系列文章匯總?cè)缦?#xff0c;覺得不錯點(diǎn)個Star,歡迎 加群 互相學(xué)習(xí)。
總結(jié)
以上是生活随笔為你收集整理的解构给默认值_5个 JS 解构有趣的用途的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: webmagic 获取文本_学习使用Ja
- 下一篇: find linux 指定后缀_linu