es6和es5函数参数和arguments的差别
注: 这里说的 es5 代表的都是非严格模式下。
es6之前函数的参数不能传默认值:
function fn(a, b){ console.log(a) console.log(b) } fn(2) // 2 // undefined
如果调用函数的时候传不传入对应的参数,则参数的值为 undefined。
es6中查参数可以设置默认值,且默认值可以是任何类型(变量,数字、函数等)。
默认值为数字、字符串等非函数和变量:
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 。
默认值为函数:
function testfn(){ return 'test' } function fn(a, b=testfn()){ console.log(a) console.log(b) } fn(2) // 2 // test
注意,默认值如果是函数的话,只有在调用 fn 函数,且未传值的时候,才会调用。
es6和es5函数 arguments 的差别:
arguments 是函数传入的实参,在es6中,如果函数有设置默认值,那么修改参数变量的值,不会影响 arguments 里面值,如:
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