您好,登錄后才能下訂單哦!
這篇文章主要介紹“JS解構(gòu)的使用方法有哪些”的相關(guān)知識(shí),小編通過(guò)實(shí)際案例向大家展示操作過(guò)程,操作方法簡(jiǎn)單快捷,實(shí)用性強(qiáng),希望這篇“JS解構(gòu)的使用方法有哪些”文章能幫助大家解決問(wèn)題。
交換2個(gè)變量的的常用做法是需要一個(gè)額外的臨時(shí)變量,來(lái)看一個(gè)簡(jiǎn)單的場(chǎng)景:
let a = 1;
let b = 2;
let temp;
temp = a;
a = b;
b = temp;
a; // => 2
b; // => 1
temp
是一個(gè)臨時(shí)變量,它保存a
的值,然后將b
的值賦給a
,最后再把temp
中保存的a
的值賦給b
,完成了交換。
解構(gòu)賦值使變量交換更簡(jiǎn)單,不需要顯式創(chuàng)建臨時(shí)變量:
let a = 1;
let b = 2;
[a, b] = [b, a];
a; // => 2
b; // => 1
[a, b] = [b, a]
是一個(gè)解構(gòu)賦值。在右邊,創(chuàng)建了一個(gè)數(shù)組[b, a]
,即[2,1],這個(gè)數(shù)組的第一項(xiàng)(即值為2)分配給a
,第二項(xiàng)(即值為1)分配給b
,完成了交換。
雖然這種方法仍然創(chuàng)建了一個(gè)臨時(shí)數(shù)組,但是這種交換變量的方式看起來(lái)更加簡(jiǎn)潔。
不僅如此,這種方法還可以交換2個(gè)以上的變量,如下:
let zero = 2;
let one = 1;
let two = 0;
[zero, one, two] = [two, one, zero];
zero; // => 0
one; // => 1
two; // => 2
你可以交換任意多的變量!不過(guò),交換兩個(gè)變量是最常見(jiàn)的場(chǎng)景。
你有一個(gè)可能為空的數(shù)組。你希望訪問(wèn)數(shù)組的第1個(gè)、第2個(gè)或第n個(gè)元素,但如果該元素不存在,則獲取一個(gè)默認(rèn)值。
通常你會(huì)使用數(shù)組的長(zhǎng)度屬性:
const colors = [];
let firstColor = 'white';
if (colors.length > 0) {
firstColor = colors[0];
}
firstColor; // => 'white'
使用數(shù)組解構(gòu)實(shí)現(xiàn)同樣的效果的代碼量更少:
const colors = [];
const [firstColor = 'white'] = colors;
firstColor; // => 'white'
const [firstColor = 'white'] = colors
解構(gòu)將colors
數(shù)組的第一個(gè)元素賦給firstColor
變量。如果數(shù)組在索引0處沒(méi)有任何元素,則分配“white”默認(rèn)值。
這里提供了更大的靈活性,如果你只想訪問(wèn)第二個(gè)元素,這也是可能的:
const colors = [];
const [, secondColor = 'black'] = colors;
secondColor; // => 'black'
注意解構(gòu)左邊的逗號(hào):它表示忽略第一個(gè)元素。secondColor
由colors
數(shù)組中索引1處的元素賦值。
當(dāng)我開(kāi)始使用React和后來(lái)的Redux時(shí),我被迫編寫(xiě)了一些涉及不可變性的代碼(這里的意思是保持原對(duì)象不變)。雖然一開(kāi)始有些困難,但后來(lái)我看到了它的好處:更容易處理單向數(shù)據(jù)流。
不變性是指禁止改變對(duì)象。幸運(yùn)的是,解構(gòu)可以幫助你輕松地以不可變的方式實(shí)現(xiàn)某些操作。
解構(gòu)與rest操作符(...
)結(jié)合來(lái)刪除數(shù)組的第一個(gè)元素:
const numbers = [1, 2, 3];
const [, ...fooNumbers] = numbers;
fooNumbers; // => [2, 3]
numbers; // => [1, 2, 3]
[, ...fooNumbers] = numbers
解構(gòu),創(chuàng)建了一個(gè)新的數(shù)組fooNumbers
,它包含了numbers
數(shù)組中除第一個(gè)元素以外的其他元素。numbers
數(shù)組沒(méi)有發(fā)生變化,保持了操作不變性。
以同樣不可變的方式,你可以從對(duì)象中刪除屬性。讓我們?cè)囍鴱腷ig對(duì)象中刪除foo屬性:
const big = {
foo: 'value Foo',
bar: 'value Bar'
};
const { foo, ...small } = big;
small; // => { bar: 'value Bar' }
big; // => { foo: 'value Foo', bar: 'value Bar' }
解構(gòu)賦值與對(duì)象rest操作符相結(jié)合,創(chuàng)建一個(gè)新對(duì)象small
,它包含了big
對(duì)象中除foo
屬性外的所有屬性。
在前面的小節(jié)中,對(duì)數(shù)組應(yīng)用了解構(gòu)。但是你可以對(duì)任何實(shí)現(xiàn)可迭代協(xié)議(iterable protocol)的對(duì)象進(jìn)行解構(gòu)。
許多原生基本類型和對(duì)象都是可迭代的:數(shù)組(arrays)、字符串(string)、類數(shù)組(typed arrays)、集合(set)和映射(map)。
例如,你可以把一個(gè)字符串解構(gòu)成幾個(gè)字符:
const str = 'cheese';
const [firstChar = ''] = str;
firstChar; // => 'c'
你并不用局限于原生的類型,通過(guò)實(shí)現(xiàn)可迭代協(xié)議,可以定制解構(gòu)邏輯。movies
包含一個(gè)movie
對(duì)象的列表。在解構(gòu)movies
時(shí),將電影標(biāo)題作為字符串來(lái)獲取是非常棒的。讓我們實(shí)現(xiàn)一個(gè)自定義迭代器:
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
對(duì)象通過(guò)定義Symbol.iterator
來(lái)實(shí)現(xiàn)可迭代協(xié)議。迭代器的方法:迭代電影的標(biāo)題。
遵循迭代協(xié)議允許將movies
對(duì)象解構(gòu)為標(biāo)題,獲取第一部電影標(biāo)題的具體方法是:const [firstMovieTitle] = movies
。
根據(jù)我的經(jīng)驗(yàn),通過(guò)屬性對(duì)對(duì)象進(jìn)行解構(gòu)比數(shù)組解構(gòu)更常見(jiàn)。對(duì)象的解構(gòu)看起來(lái)很簡(jiǎn)單:
const movie = { title: 'Heat' };
const { title } = movie;
title; // => 'Heat'
const {title} = movie
創(chuàng)建一個(gè)變量title
,并將屬性movie.title
的值賦給它。
當(dāng)我第一次讀到對(duì)象解構(gòu)時(shí),我有點(diǎn)驚訝于你不必靜態(tài)地知道屬性名,你可以使用動(dòng)態(tài)屬性名稱來(lái)解構(gòu)對(duì)象!
function greet(obj, nameProp) {
const { [nameProp]: name = 'Unknown' } = obj;
return `Hello, ${name}!`;
}
greet({ name: 'Batman' }, 'name'); // => 'Hello, Batman!'
greet({ }, 'name'); // => 'Hello, Unknown!'
greet()
函數(shù)有兩個(gè)參數(shù):對(duì)象和屬性名。在greet()
函數(shù)內(nèi)部,解構(gòu)賦值const {[nameProp]: name = 'Unknown'} = obj
使用中括號(hào)[nameProp]
讀取動(dòng)態(tài)屬性名,name變量作為別名接收動(dòng)態(tài)屬性值。如果屬性不存在,你還可以給它賦一個(gè)默認(rèn)值Unknown
。
關(guān)于“JS解構(gòu)的使用方法有哪些”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí),可以關(guān)注億速云行業(yè)資訊頻道,小編每天都會(huì)為大家更新不同的知識(shí)點(diǎn)。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。