1. 程式人生 > >ES6 函數參數的默認值

ES6 函數參數的默認值

解構 function ret 不起作用 length 不用 als 文檔 調用

基本用法

在ES6之前,不能直接為函數的參數指定默認值,只能采取變通的方法。

function log(x,y){
    y = y||‘world‘;
    console.log(x,y);
}
log(‘kkk‘);//kkk world

這種寫法的缺點在於:
如果參數y賦值了,但是對應的布爾值為false,則該賦值不起作用。如果在調用函數的時候,傳入的y參數是一個空字符串,那麽y就會被修改為默認值。
避免這個問題,需要先判斷一下:1.通過判斷值是否等於undefined,2.判斷arguments.length是否為1.

但是ES6允許為函數的參數設置默認值,即直接寫在參數定義的後面。

function log(x,y=‘world‘){
    console.log(x,y);
}
log(‘hello‘); //hello world

ES6語法的好處:
1.簡潔
2.閱讀代碼的人可以看出哪些參數是可以省略的,不用查看函數體或文檔
3.有利於將來的代碼優化,即使未來的版本即使拿掉這個參數,以前的代碼也可以運行
還有參數變量是默認聲明的,不能在函數體內部再進行聲明。

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

這裏有兩種寫法需要區分一下:

function m1({x=0,y=0} = {}){
    return [x,y];
}
function m2({x,y} = {x:0,y:0}){
    return [x,y];
}
m1({x:3});//[3,0]
m2({x:3});//[3,undefined]
m1({});//[0,0]
m2({});//[undefined,undefined]

參數默認值的位置

通常情況下,定義了默認值的參數應該是函數的尾參數。因為這樣比較容易看出,到底省略了哪些參數,如果非尾部的參數設置默認值,實際上這個參數是無法省略的。
如果有默認值的參數都不是尾參數,這時,無法只省略該參數而不省略其後的參數,除非顯示輸入undefined。如果傳入undefined,那麽就會觸發默認值,但是null沒有這個效果。
函數的length屬性
如果函數指定了默認值後,函數的length屬性就不會包含有默認值的參數。這是因為length屬性的含義是,該函數預期傳入的參數個數,某個參數指定默認值之後,預期傳入的參數個數就不包括
這個參數了,同理,rest參數也不會計入length屬性。
函數參數默認值的類型


(1)變量
如果函數參數的默認值是一個變量,則該變量所處的作用域和其他變量的作用域規則相同,即是先前函數的作用域,然後再是全局作用域。
(2)函數
如果函數A的參數默認值是函數B,那麽由於函數的作用域是其聲明的時候所在的作用域,函數B的作用域就在全局作用域而不是函數A的作用域。

ES6 函數參數的默認值