注: 這裏說的 es5 表明的都是非嚴格模式下。es6
function fn(a, b){ console.log(a) console.log(b) } fn(2) // 2 // undefined
若是調用函數的時候傳不傳入對應的參數,則參數的值爲 undefined。函數
es6中查參數能夠設置默認值,且默認值能夠是任何類型(變量,數字、函數等)。es5
function fn(a, b=3){ console.log(a) console.log(b) } fn(2) // 2 // 3
let d = 5; function fn(a, b=a, c=d){ console.log(a) cosnole.log(b) cosnole.log(c) } fn(2) // 2 // 2 // 5
注意:默認值是變量且變量也是當前函數的參數的話,不能將後面的變量賦值給前面的參數當默認值,如上面代碼,能將參數 a 賦值給 b ,可是不能將 b 賦值給 a 。spa
function testfn(){ return 'test' } function fn(a, b=testfn()){ console.log(a) console.log(b) } fn(2) // 2 // test
注意,默認值若是是函數的話,只有在調用 fn 函數,且未傳值的時候,纔會調用。code
arguments 是函數傳入的實參,在es6中,若是函數有設置默認值,那麼修改參數變量的值,不會影響 arguments 裏面值,如:blog
function fn(a, b=5){ a = 3; console.log(a) console.log(arguments[0]) } fn(2) // 3 // 2
這裏,我在函數內部將參數 a 的值改爲了 3,可是arguments[0] 的值仍是傳入的2。字符串
若是定義函數的時候,沒有設置默認值,那麼修改參數的值會致使 arguments 裏面的值同步被修改,如:同步
function fn(a, b){ a = 3; console.log(a) console.log(arguments[0]) } fn(2) // 3 // 3