ES6中函數參數的默認值

基本用法

在學習ES6之前,不能直接爲函數參數指定默認值,只能採取變通的方法。如下:

       function gets(x,y){
           y = y || 0;
           console.log(x,y);
       } 
       gets(2); //2 0
       gets(2,2); //2 2
       gets(2,) //2 0

上面代碼的缺點是如果我給第二個參數賦值爲空的話,第二個參數 y 卻被改爲了默認值。
爲了避免這種情況,通常需要檢測參數 y 是否被賦值了,如果沒有,在等於默認值。

if(typeof y === 'undefined'){
	y = 0;
}

ES6中就出現了簡潔的方法來實現同樣的功能,ES允許爲函數參數設置默認值,即直接寫在參數定義的後面。

       function gets(x,y = 0){
           console.log(x,y);
       } 
       gets(2); //2 0
       gets(2,2); //2 2
       gets(2,) //2 0

ES6的寫法比之前簡單多了。
這樣寫的好處是:

  • 可以立刻意識到哪些參數是可以省略的,不用查看函數體或文檔;
  • 有利於將來的代碼優化,即使未來的版本在對外接口中,徹底拿掉這個參數,也不會導致以前的代碼無法運行。

但是要注意:函數參數指定默認值的時候,參數默認值的位置最好應該是給最後一個參數指定默認值。而且參數變量是默認聲明的,所以不能用let或者const再次聲明。

 function foo(x = 5) {
     let x = 1; // error
     const x = 2; // error
 }

與解構賦值默認值結合使用

例如:

function foo({x, y = 5}) {
  console.log(x, y);
}

foo({}) // undefined 5
foo({x: 1}) // 1 5
foo({x: 1, y: 2}) // 1 2
foo() // TypeError: Cannot read property 'x' of undefined

第四次調用的時候參數不是對象的形式,解構賦值不成功報錯。

function foo({x, y = 5} = {}) {
  console.log(x, y);
}

foo() // undefined 5

上面代碼指定,如果沒有提供參數,函數foo的參數默認爲一個空對象。

// 寫法一
function m1({x = 0, y = 0} = {}) {
  return [x, y];
}

// 寫法二
function m2({x, y} = { x: 0, y: 0 }) {
  return [x, y];
}
// 函數沒有參數的情況
m1() // [0, 0]
m2() // [0, 0]

// x 和 y 都有值的情況
m1({x: 3, y: 8}) // [3, 8]
m2({x: 3, y: 8}) // [3, 8]

// x 有值,y 無值的情況
m1({x: 3}) // [3, 0]
m2({x: 3}) // [3, undefined]

// x 和 y 都無值的情況
m1({}) // [0, 0];
m2({}) // [undefined, undefined]

m1({z: 3}) // [0, 0]
m2({z: 3}) // [undefined, undefined]

上面兩種寫法都對函數的參數設定了默認值,區別是寫法一函數參數的默認值是空對象,但是設置了對象解構賦值的默認值;寫法二函數參數的默認值是一個有具體屬性的對象,但是沒有設置對象解構賦值的默認值。

函數的 length 屬性

ES6中指定了函數默認值的話,函數的 length 屬性將返回沒有指定默認值的參數個數,意思就是指定了默認值以後,其 length 將會失真。
例如:

    function fon(x,y,z = 1){

    }
    console.log(fon.length)  //2

作用域

給函數參數設置默認值,函數在進行聲明初始化時,參數會形成一個單獨的作用域,等初始化結束後這個作用域自動消失。

var x = 1;
function gets(x,y = x){
	console.log(y);
}
gets(3) //3

上面代碼中,參數y的默認值等於變量x。調用函數f時,參數形成一個單獨的作用域。在這個作用域裏面,默認值變量x指向第一個參數x,而不是全局變量x,所以輸出是2。

應用

  • 利用參數默認值,可以指定某一個參數不得省略,如果省略就拋出一個錯誤。
function throws() {
  throw new Error('Missing parameter');
}

function foo(element = throws()) {
  return element;
}

foo()
// Error: Missing parameter
  • 可以將參數默認值設爲 undefined ,表明這個參數是可以省略的。
function foo(optional = undefined) { ··· }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章