摘要:參數(shù)的形式為變量名擴展運算符是三個點。傳遞給函數(shù)的一組參數(shù)值,被整合成了數(shù)組。擴展運算符的應(yīng)用普通的函數(shù)調(diào)用上面代碼中,和這兩行,都是函數(shù)的調(diào)用,它們的都使用了擴展運算符。這時,擴展運算符可以將其轉(zhuǎn)為真正的數(shù)組,原因就在于對象實現(xiàn)了。
rest參數(shù)和擴展運算符都是ES6新增的特性。
rest參數(shù)的形式為:...變量名;擴展運算符是三個點(...)。
rest參數(shù)用于獲取函數(shù)的多余參數(shù),這樣就不需要使用arguments對象了。rest參數(shù)搭配的變量是一個數(shù)組,該變量將多余的參數(shù)放入數(shù)組中。
function add(...values) { let sum = 0; for (var val of values) { sum += val; } return sum; } add(1, 2, 3) // 6
傳遞給 add 函數(shù)的一組參數(shù)值,被整合成了數(shù)組 values。
下面是一個 rest 參數(shù)代替arguments變量的例子。
// arguments變量的寫法 function sortNumbers() { return Array.prototype.slice.call(arguments).sort(); } // rest參數(shù)的寫法 const sortNumbers = (...numbers) => numbers.sort();
rest參數(shù)和arguments對象的區(qū)別
rest參數(shù)只包含那些沒有對應(yīng)形參的實參;而 arguments 對象包含了傳給函數(shù)的所有實參。
arguments 對象不是一個真實的數(shù)組;而rest參數(shù)是真實的 Array 實例,也就是說你能夠在它上面直接使用所有的數(shù)組方法。
arguments 對象對象還有一些附加的屬性 (比如callee屬性)。
另外,使用rest參數(shù)時應(yīng)注意一下兩點:
rest 參數(shù)之后不能再有其他參數(shù)(即只能是最后一個參數(shù)),否則會報錯。
function f(a, ...b, c) { ... } // 報錯
函數(shù)的length屬性,不包括 rest 參數(shù)。
(function(a) {}).length // 1 (function(...a) {}).length // 0 (function(a, ...b) {}).length // 1擴展運算符
擴展運算符可以看做是 rest 參數(shù)的逆運算,將一個數(shù)組轉(zhuǎn)為用逗號分隔的參數(shù)序列。
console.log(...[1, 2, 3]) // 1 2 3 console.log(1, ...[2, 3, 4], 5) //1 2 3 4 5擴展運算符的應(yīng)用 普通的函數(shù)調(diào)用
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)這兩行,都是函數(shù)的調(diào)用,它們的都使用了擴展運算符。該運算符將一個數(shù)組,變?yōu)閰?shù)序列。
替代 apply 方法調(diào)用函數(shù)// 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);合并數(shù)組
var arr1 = ["a", "b"]; var arr2 = ["c"]; var arr3 = ["d", "e"]; // ES5的合并數(shù)組 arr1.concat(arr2, arr3) // [ "a", "b", "c", "d", "e" ] // ES6的合并數(shù)組 [...arr1, ...arr2, ...arr3] // [ "a", "b", "c", "d", "e" ]與解構(gòu)賦值結(jié)合
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 // []
如果將擴展運算符用于數(shù)組賦值,只能放在參數(shù)的最后一位,否則會報錯。
const [...butLast, last] = [1, 2, 3, 4, 5]; // 報錯 const [first, ...middle, last] = [1, 2, 3, 4, 5]; // 報錯將字符串轉(zhuǎn)為數(shù)組
var str = "hello"; // ES5 var arr1 = str.split(""); // [ "h", "e", "l", "l", "o" ] // ES6 var arr2 = [...str]; // [ "h", "e", "l", "l", "o" ]實現(xiàn)了 Iterator 接口的對象
任何 Iterator 接口的對象,都可以用擴展運算符轉(zhuǎn)為真正的數(shù)組。
var nodeList = document.querySelectorAll("div"); var array = [...nodeList];
上面代碼中,querySelectorAll方法返回的是一個nodeList對象。它不是數(shù)組,而是一個類似數(shù)組的對象。這時,擴展運算符可以將其轉(zhuǎn)為真正的數(shù)組,原因就在于NodeList對象實現(xiàn)了 Iterator 。
總結(jié)從上面的例子可以看出,rest參數(shù)使用場景應(yīng)該稍少一些,主要是處理不定數(shù)量參數(shù),可以避免arguments對象的使用。而擴展運算符的應(yīng)用就比較廣了,在實際項目中靈活應(yīng)用,能寫出更精簡的代碼。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/84073.html
摘要:擴展運算符簡介擴展運算符是三個點,可以將一個數(shù)組轉(zhuǎn)為用逗號分隔的參數(shù)序列。在實際項目中靈活應(yīng)用擴展運算符運算符,能寫出更精簡易讀性高的代碼。 1、擴展運算符簡介 擴展運算符( spread )是三個點(...),可以將一個數(shù)組轉(zhuǎn)為用逗號分隔的參數(shù)序列。 說的通俗易懂點,有點像化骨綿掌,把一個大元素給打散成一個個單獨的小元素。 showImg(https://segmentfault.c...
摘要:在語法中,操作符有兩種意義剩余語法,參數(shù)和展開語法,展開數(shù)組對象,作為函數(shù)數(shù)組對象的擴展運算符。使用和參數(shù)進行操作其余參數(shù)傳給原始函數(shù)展開語法運算則可以看作是參數(shù)的逆運算。 在ES6語法中,...操作符有兩種意義:rest(剩余語法,rest參數(shù)) 和 spread(展開語法,展開數(shù)組/對象),作為函數(shù)、數(shù)組、對象的擴展運算符。 從某種意義上說,剩余語法與展開語法是相反的:剩余語法將多...
摘要:模板字符串甚至還能嵌套解構(gòu)賦值允許按照一定模式,從數(shù)組和對象中提取值,對變量進行賦值,這被稱為解構(gòu)。運算符使用場景應(yīng)該稍少一些,主要是處理不定數(shù)量參數(shù),可以避免對象的使用。 es6中較為常用的書寫風(fēng)格 為了書寫的方便,es6中提出了很多比較友好的書寫方式,其中最為常見的屬于以下幾個: 字符串模板 `abcdef${test}` 解構(gòu)賦值 let [a, b, c] = [1,...
摘要:學(xué)習(xí)筆記函數(shù)擴展函數(shù)參數(shù)的默認(rèn)值如果參數(shù)默認(rèn)值是變量,那么參數(shù)就不是傳值的,而是每次都重新計算默認(rèn)值表達(dá)式的值。屬性函數(shù)的屬性,返回該函數(shù)的函數(shù)名。箭頭函數(shù)詳細(xì)鏈接參考引用函數(shù)擴展 es6學(xué)習(xí)筆記-函數(shù)擴展_v1.0 函數(shù)參數(shù)的默認(rèn)值 function Point(x = 0, y = 0) { this.x = x; this.y = y; } var p = ne...
摘要:將數(shù)組中的每個元素展開為函數(shù)參數(shù)擴展運算符取代方法的一個實際的例子,應(yīng)用方法,簡化求出一個數(shù)組最大元素的寫法。 歡迎訪問我的個人博客:http://www.xiaolongwu.cn 前言 記錄一下在實際開發(fā)中,很有用的三個es6的新方法 用法詳解 默認(rèn)參數(shù) function f(x, y=13) { // 如果沒有傳入y或傳入了undefined,y的默認(rèn)值為13 retur...
閱讀 1695·2021-11-24 09:39
閱讀 3150·2021-11-22 15:24
閱讀 3099·2021-10-26 09:51
閱讀 3287·2021-10-19 11:46
閱讀 2900·2019-08-30 15:44
閱讀 2225·2019-08-29 15:30
閱讀 2544·2019-08-29 15:05
閱讀 782·2019-08-29 10:55