前言
本文主要給大家介紹了關于ES6中rest參數與擴展運算符的相關內容,rest參數和擴展運算符都是ES6新增的特性。rest參數的形式為:...變量名;擴展運算符是三個點(...)。下面話不多說了,來一起看看詳細的介紹:
rest參數
rest參數用于獲取函數的多余參數,這樣就不需要使用arguments對象了。rest參數搭配的變量是一個數組,該變量將多余的參數放入數組中。
function add(...values) {
let sum = 0;
for (var val of values) {
sum += val;
}
return sum;
}
add(1, 2, 3) // 6
傳遞給 add 函數的一組參數值,被整合成了數組 values。
下面是一個 rest 參數代替arguments變量的例子。
// arguments變量的寫法
function sortNumbers() {
return Array.prototype.slice.call(arguments).sort();
}
// rest參數的寫法
const sortNumbers = (...numbers) => numbers.sort();
rest參數和arguments對象的區別
另外,使用rest參數時應注意一下兩點:
1、rest 參數之后不能再有其他參數(即只能是最后一個參數),否則會報錯。
function f(a, ...b, c) { ... } // 報錯
2、函數的length屬性,不包括 rest 參數。
(function(a) {}).length // 1
(function(...a) {}).length // 0
(function(a, ...b) {}).length // 1
擴展運算符
擴展運算符可以看做是 rest 參數的逆運算,將一個數組轉為用逗號分隔的參數序列。
console.log(...[1, 2, 3]) // 1 2 3 console.log(1, ...[2, 3, 4], 5) //1 2 3 4 5
擴展運算符的應用
普通的函數調用
function push(array, ...items) {
array.push(...items);
}
function add(x, y) {
return x + y;
}
var numbers = [4, 38];
add(...numbers) // 42
上面代碼中,array.push(...items)和add(...numbers)這兩行,都是函數的調用,它們的都使用了擴展運算符。該運算符將一個數組,變為參數序列。
替代 apply 方法調用函數
// ES5 的寫法 Math.max.apply(null, [14, 3, 77]) // ES6 的寫法 Math.max(...[14, 3, 77]) // 等同于 Math.max(14, 3, 77);
// ES5 的寫法 var arr1 = [0, 1, 2]; var arr2 = [3, 4, 5]; Array.prototype.push.apply(arr1, arr2); // ES6 的寫法 var arr1 = [0, 1, 2]; var arr2 = [3, 4, 5]; arr1.push(...arr2);
合并數組
var arr1 = ['a', 'b']; var arr2 = ['c']; var arr3 = ['d', 'e']; // ES5的合并數組 arr1.concat(arr2, arr3) // [ 'a', 'b', 'c', 'd', 'e' ] // ES6的合并數組 [...arr1, ...arr2, ...arr3] // [ 'a', 'b', 'c', 'd', 'e' ]
與解構賦值結合
const [first, ...rest] = [1, 2, 3, 4, 5]; first // 1 rest // [2, 3, 4, 5] const [first, ...rest] = []; first // undefined rest // [] const [first, ...rest] = ["foo"]; first // "foo" rest // []
如果將擴展運算符用于數組賦值,只能放在參數的最后一位,否則會報錯。
const [...butLast, last] = [1, 2, 3, 4, 5]; // 報錯 const [first, ...middle, last] = [1, 2, 3, 4, 5]; // 報錯
將字符串轉為數組
var str = 'hello';
// ES5
var arr1 = str.split(''); // [ "h", "e", "l", "l", "o" ]
// ES6
var arr2 = [...str]; // [ "h", "e", "l", "l", "o" ]
實現了 Iterator 接口的對象
任何 Iterator 接口的對象,都可以用擴展運算符轉為真正的數組。
var nodeList = document.querySelectorAll('div');
var array = [...nodeList];
上面代碼中,querySelectorAll方法返回的是一個nodeList對象。它不是數組,而是一個類似數組的對象。這時,擴展運算符可以將其轉為真正的數組,原因就在于NodeList對象實現了 Iterator 。
總結
從上面的例子可以看出,rest參數使用場景應該稍少一些,主要是處理不定數量參數,可以避免arguments對象的使用。而擴展運算符的應用就比較廣了,在實際項目中靈活應用,能寫出更精簡的代碼。
好了,以上就是這篇文章的全部內容,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。