本文實例講述了ES6新特性之函數(shù)的擴展。分享給大家供大家參考,具體如下:
一、函數(shù)參數(shù)默認值
1. ES6允許為函數(shù)的參數(shù)設置默認值,即直接寫在參數(shù)定義的后面。
function log(x, y = 'World') {  console.log(x, y);}log('Hello') // Hello Worldlog('Hello', 'China') // Hello Chinalog('Hello', '') // Hello這種寫法有兩個好處:首先,閱讀代碼的人,可以立刻意識到哪些參數(shù)是可以省略的,不用查看函數(shù)體或文檔;其次,有利于將來的代碼優(yōu)化,即使未來的版本在對外接口中,徹底拿掉這個參數(shù),也不會導致以前的代碼無法運行。
參數(shù)變量是默認聲明的,所以不能用let或const再次聲明。否則會報錯。
2. 參數(shù)默認值可以與解構賦值的默認值,結(jié)合起來使用。
function foo({x, y = 5}) {  console.log(x, y);}foo({}) // undefined, 5foo({x: 1}) // 1, 5foo({x: 1, y: 2}) // 1, 2foo() // TypeError: Cannot read property 'x' of undefined通常情況下,定義了默認值的參數(shù),應該是函數(shù)的尾參數(shù)。因為這樣比較容易看出來,到底省略了哪些參數(shù)。如果非尾部的參數(shù)設置默認值,實際上這個參數(shù)是沒法省略的。
指定了默認值以后,函數(shù)的length屬性,將返回沒有指定默認值的參數(shù)個數(shù)。也就是說,指定了默認值后,length屬性將失真。
(function (a) {}).length // 1(function (a = 5) {}).length // 0(function (a, b, c = 5) {}).length // 2二、rest參數(shù)
ES6引入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(2, 5, 3) // 10上面代碼的add函數(shù)是一個求和函數(shù),利用rest參數(shù),可以向該函數(shù)傳入任意數(shù)目的參數(shù)。
注意,rest參數(shù)之后不能再有其他參數(shù)(即只能是最后一個參數(shù)),否則會報錯。
函數(shù)的length屬性,不包括rest參數(shù)。
三、擴展運算符
擴展運算符(spread)是三個點(...)。它好比rest參數(shù)的逆運算,將一個數(shù)組轉(zhuǎn)為用逗號分隔的參數(shù)序列。
console.log(...[1, 2, 3])// 1 2 3console.log(1, ...[2, 3, 4], 5)// 1 2 3 4 5[...document.querySelectorAll('div')]// [<div>, <div>, <div>]四、箭頭函數(shù)
ES6允許使用“箭頭”(=>)定義函數(shù)。箭頭函數(shù)前面是輸入,后面是輸出。inputs => outputs
var f = v => v;//上面的箭頭函數(shù)等同于:var f = function(v) { return v;};如果箭頭函數(shù)不需要參數(shù)或需要多個參數(shù),就使用一個圓括號代表參數(shù)部分。
var f = () => 5;// 等同于var f = function () { return 5 };var sum = (num1, num2) => num1 + num2;// 等同于var sum = function(num1, num2) { return num1 + num2;};如果箭頭函數(shù)的代碼塊部分多于一條語句,就要使用大括號將它們括起來,并且使用return語句返回。
var sum = (num1, num2) => { return num1 + num2; }//由于大括號被解釋為代碼塊,所以如果箭頭函數(shù)直接返回一個對象,必須在對象外面加上括號。var getTempItem = id => ({ id: id, name: "Temp" });箭頭函數(shù)可以與變量解構結(jié)合使用。
const full = ({ first, last }) => first + ' ' + last;// 等同于function full(person) { return person.first + ' ' + person.last;}箭頭函數(shù)的一個用處是簡化回調(diào)函數(shù)。
// 正常函數(shù)寫法[1,2,3].map(function (x) { return x * x;});// 箭頭函數(shù)寫法[1,2,3].map(x => x * x);下面是rest參數(shù)與箭頭函數(shù)結(jié)合的例子。
const numbers = (...nums) => nums;numbers(1, 2, 3, 4, 5)// [1,2,3,4,5]
箭頭函數(shù)有幾個使用注意點。
(1)函數(shù)體內(nèi)的this對象,就是定義時所在的對象,而不是使用時所在的對象。
(2)不可以當作構造函數(shù),也就是說,不可以使用new命令,否則會拋出一個錯誤。
(3)不可以使用arguments對象,該對象在函數(shù)體內(nèi)不存在。如果要用,可以用Rest參數(shù)代替。
(4)不可以使用yield命令,因此箭頭函數(shù)不能用作Generator函數(shù)。
上面四點中,第一點尤其值得注意。this對象的指向是可變的,但是在箭頭函數(shù)中,它是固定的。
五、函數(shù)參數(shù)的尾逗號
ECMAScript 2017將函數(shù)的最后一個參數(shù)有尾逗號(trailing comma)。
此前,函數(shù)定義和調(diào)用時,都不允許最后一個參數(shù)后面出現(xiàn)逗號。
function clownsEverywhere(  param1,  param2) { /* ... */ }上面代碼中,如果在param2或bar后面加一個逗號,就會報錯。
這樣的話,如果以后修改代碼,想為函數(shù)clownsEverywhere添加第三個參數(shù),就勢必要在第二個參數(shù)后面添加一個逗號。這對版本管理系統(tǒng)來說,就會顯示,添加逗號的那一行也發(fā)生了變動。這看上去有點冗余,因此新的語法允許定義和調(diào)用時,尾部直接有一個逗號。
function clownsEverywhere(  param1,  param2,) { /* ... */ }希望本文所述對大家ECMAScript程序設計有所幫助。
新聞熱點
疑難解答