1. 程式人生 > >ES6系列_4之擴充套件運算子和rest運算子

ES6系列_4之擴充套件運算子和rest運算子

運算子可以很好的為我們解決引數和物件陣列未知情況下的程式設計,讓我們的程式碼更健壯和簡潔。

運算子有兩種:物件擴充套件運算子與rest運算子。

1.物件擴充套件( spread)運算子(...)

(1)解決引數個數問題

以前我們程式設計是傳遞的引數一般是確定,否則將會報錯或者異常,如下:

function test(a,b,c,d) {
    console.log(a)
    console.log(b)
    console.log(c)
    console.log(d)
    console.log(e)//e is not defined
}

test(1,2,3,4)

引數固定,多餘的引數會出錯。

但我們又想傳遞多個引數,但是不確定引數的個數,這時候可以使用物件擴充套件運算子來作引數。

function test1(...arg) {
    console.log(arg[0]);//1
    console.log(arg[1]);//2
    console.log(arg[2]);//3
    console.log(arg[3])//4
    console.log(arg[4])//5
    console.log(arg[5])//undefined
}

test1(1,2,3,4,5)

這時候程式是不會報錯的,多餘取值返回的結果是undefined。這說明是可以傳入多個值,並且就算方法中引用多了也不會報錯。

(2)解決陣列賦值問題

我們先用一個例子說明,我們宣告兩個陣列arr1和arr2,然後我們把arr1賦值給arr2,然後我們改變arr2的值,你會發現arr1的值也改變了,因為我們這是對記憶體堆疊的引用,而不是真正的賦值。

let arr1=['i','love','you'];
let arr2=arr1;
console.log("arr2====",arr2);
arr2.push('too');
console.log("arr1====>",arr1);

控制檯輸出的結果為:

 ["i", "love", "you"]

 ["i", "love", "you", "too"]

這是我們不想看到的,可以利用物件擴充套件運算子簡單的解決這個問題,現在我們對程式碼進行改造。

let arr1=['i','love','you'];
let arr2=[...arr1];
console.log(arr2);
arr2.push('too');
console.log(arr1);

最終可以看到我們的arr1並沒有改變,簡單的擴充套件運算子就解決了這個問題。

2.rest運算子

(1)含義

rest引數作用: 將多餘的逗號分隔的引數序列轉換為陣列引數 注意: rest引數必須是最後一個引數,否則報錯。

rest運算子與物件擴充套件運算子有很多類似之處,它也用…(三個點)來表示,比如:

function test(first,...arg){
  console.log("first==>",first)//0
  console.log("arg=====>",arg)
}
test(0,1,2,3,4,5,6,7);

輸出結果為:

first==> 0
arg=====>[1, 2, 3, 4, 5, 6, 7]

 (2)如何迴圈輸出rest運算子

用for…of迴圈來進行打印出arg的值

function test(first,...arg){
   for(let val of arg){
       console.log(val)
   }
}
test(0,1,2,3,4,5,6,7);

結果為:1,2,3,4,5,6,7

最後總結:

擴充套件運算子用三個點號表示,功能是把陣列或類陣列物件展開成一系列用逗號隔開的值
rest運算子也是三個點號,不過其功能與擴充套件運算子恰好相反,把逗號隔開的值序列組合成一個數組
當三個點(...)在等號左邊,或者放在形參上。為 rest 運算子
當三個在等號右邊,或者放在實參上,是 spread運算子

或者說:放在被賦值一方是rest 運算子。放在賦值一方式 spread運算子。