1. 程式人生 > 程式設計 >ES6中的Javascript解構的實現

ES6中的Javascript解構的實現

ES6中的解構特效能讓我們從物件(Object)或者是陣列(Array)中取值的時候更方便,同時寫出來的程式碼在可讀性方面也更強。之前接觸過python語言的小夥伴應該對這個不會陌生,這個特性早已在python中實現了。在python中,我們可以通過下面的程式碼來取值

lst = [3,5]
first,second = lst 
print(first,second)

first和second兩個變數,分別被賦值上了陣列中的3和5,是不是很簡單很清晰?
那在有這個特性之前,我們一般怎麼從物件或陣列中取值呢?來看看下面的程式碼:

let list = [3,5]
let first = list[0]
let second = list[1]

在這種方式中,你必須得手動指定個數組下標,才能把對應的值賦給你指定的變數。那如果用ES6的解構特性,程式碼將會變得更簡潔,可讀性也更高:

let [first,second] = list;

物件的解構

基礎物件解構

首先我們來看看ES6中基本的物件解構應該怎麼寫:

const family = {
 father: ''
 mother: ''
}
const { father,mother } = family;

我們從family物件中解構出來了它的兩個屬性father和mother,並賦值給了另外定義的father和mother物件。此後,我們就能直接通過father和mother變數獲取到family中相應key的值了。這個例子是解構物件最簡單的一種應用,下面來看看更有趣的。

解構沒有宣告過的物件

在上面的例子中,我們先宣告的family物件,然後再通過解構語法獲取其中的值。那如果不宣告是否可以呢:

const { father,mother } = {father: '',mother: ''}

其實也是可以的,在一些情況下,我們是沒有必要特意去宣告一個物件或是把物件賦值給一個變數,然後去才解構的。很多時候我們可以直接解構未宣告的物件。

解構物件並重命名變數

我們也可以將物件中的屬性解構之後,並對其重新命名,比如:

const { father: f,mother:m } = {father: '1',mother: '2'}
console.log(f); // '1'

在上面的程式碼中,物件中的father被解構出來後,重新賦值給了變數f,與前一個例子相比,相當於重名了了father變數為f。接下來就可以用f繼續進行操作。

解構預設值

想象一下一種場景,後臺返回了一個family物件,原本family物件約定了有三個屬性,分別為father,mother,child。你拿到返回的資料並解構這三個屬性:

const { father,mother,child } = {father: '1',mother: '2',child: '3'}

這看上去沒有什麼問題,但現實情況總是不如人意。後臺由於程式碼有bug,返回的family物件中,只包含了mother和child,漏了father。這時經過上面程式碼的解構後, father就會變成undefined:

const { father,mother: '2'}
console.log(child) //undefined

很多時候我們會想要在後臺漏了某個屬性的時候,也能解構出一個預設值。那其實可以這麼寫:

const { father = '1',mother = '2',child = '3'} = {father: '1',mother: '2'}
console.log(child) //'3'

結合前一個例子,你既可以改變數名又能賦值預設值:

const { father: f = '1',mother: m = '2',child: c = '3'} = {father: '1',mother: '2'}

在函式引數中解構

const family = {
 father: ''
 mother: ''
}
function log({father}){
 console.log(father)
}
log(family)

在函式的引數中,運用解構的方式,可以直接獲取出入物件的屬性值,不需要像以往使用family.father傳入。

解構巢狀物件

在上面的例子中,family的屬性都只有1層,如果family的某些屬性的值也是一個物件或陣列,那怎麼將這些巢狀物件的屬性值解構出來呢?來看看下面的程式碼:

const family = {
 father: 'mike'
 mother: [{
 name: 'mary'
 }]
}
const { father,mother: [{
 name:motherName
}]} = family;

console.log(father); //'mike'
console.log(motherName) //'mary'

陣列的解構

陣列的解構方式其實跟物件的非常相似,在文章開頭也略有提及,不過我們還是來看一下陣列解構的一些典型場景。

基礎物件解構

const car = ['AUDI','BMW'];

const [audi,bmw] = car;
console.log(audi); // "AUDI"
console.log(bmw); // "BMW"

只要對應陣列的位置,就能正確的解構出相應的值。

解構預設值

同對象解構的預設值場景,很多時候我們也需要在解構陣列的時候加上預設值以滿足業務需要。

const car = ['AUDI',bmw,benz = 'BENZ'] = car;
console.log(benz); // "BENZ"

在解構中交換變數

假設我們有如下兩個變數:

let car1 = 'bmw';
let car2 = 'audi'

如果我們想交換這兩個變數,以往的做法是:

let temp = car1;
car1 = car2;
car2 = temp;

需要藉助一箇中間變數來實現。那利用陣列的解構,就簡單很多:

let car1 = 'bmw';
let car2 = 'audi'
[car2,car1] = [car1,car2]
console.log(car1); // 'audi'
console.log(car2); // 'bmw'

如果是想在一個數組內部完成元素位置的交換,比如吧[1,2,3]交換成[1,3,2],那麼可以這麼實現:

const arr = [1,3];
[arr[2],arr[1]] = [arr[1],arr[2]];
console.log(arr); // [1,2]

從函式的返回解構陣列

很多函式會返回陣列型別的結果,通過陣列解構可以直接拿值:

functin fun(){
 return [1,3]
}
let a,b,c; 
[a,c] = fun();

當然,如果我們只想要函式返回陣列中的其中一些值,那也可以把他們忽略掉

functin fun(){
 return [1,c] = fun();

可以看到,ES6的解構特性在很多場景下是非常有用的。期望大家能更多的將解構運用到專案中,讓程式碼變得更加簡單,清晰易懂。

到此這篇關於ES6中的Javascript解構的實現的文章就介紹到這了,更多相關ES6 解構內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!