ES5到ES6的函数参数变化

函数参数

ES5:

  • 函数不介意传递多少个参数,或者是否传递参数。
  • 原因在于ES5中的参数在内部是用一个数组来表示的。
  • 函数内部则可以用arguments对象来访问这个参数数组,从而获取每个传进来的数组(eg:arguments[0]...)
function howMany() {
    console.log(arguments.length)
}
howMany('111',12); // 2
howMany(12); // 1
howMany(); // 0
  • 另外。arguments对象中的值会自动反应到对应的命名函数中去,因此若在函数内部设置arguments中的值,是能够改变传进这个参数的。

ES6:

  • 可以为函数参数设置默认值,请直接写在参数定义的后边
  • 参数默认不传值,因此每次遇到参数默认值都会重新赋值,这也叫 惰性求值
  • 函数指定默认值后,对函数求长度时就只能返回没有指定默认值的参数个数,如:(function(a = 5, b){}).length // 2
  • 函数参数也可以使用rest函数的方法,这比ES5更加简单,例:
function sortNum() { return Array.prototype.slice.call(arguments).sort(); }
// rest
const sortNum = (...num) => return num.sort();
  • 参数亦可使用对象的结构赋值默认值,但是有诸多要求:我们用代码来讲:
function stu(grades,{sex:'girl',age:'18',like:{}}) {
    console.log(age)
}
stu(89,{}) // 18
stu(89) // 报错
// 因此得出结论,这种写法下,函数参数涉及对象时,传参一定需要传入对象与之对应
// 写法一
function m1({x = 0, y = 0} = {}) {
return [x, y];
}

// 写法二
function m2({x, y} = { x: 0, y: 0 }) {
return [x, y];
}
// 这个稍微复杂一些,我们试着调用它看看
// 1. 函数没有参数的情况
m1() // [0, 0]
m2() // [0, 0]

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

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

// 4. x和y都无值的情况
m1({}) // [0, 0];
m2({}) // [undefined, undefined]

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

根据上述代码,我们可以总结一下:

  • {x = 0, y = 0} = {}下,我们先看是否有传递参数,若没有则右边默认的= {}就会生效(第一种情况),若有它就会不生效,在它不生效时,我们看传递的参数内层,如果内部 符合函数参数对象 内部默认的 x y两个参数,,就利用传入的原值,如果不符合 就会启用内层x y 的默认值 。(第二三四种情况)
  • {x, y} = { x: 0, y: 0 }下,照例先看传参的外层,如果没有传递,则右边的 = { x: 0, y: 0 }生效(第一种情况),如果有传递那自然不生效,不失效时,来观察函数参数的等号左侧,现在它是我们的参数列表({x, y} =),可以看到,它没有默认值,因此当传参的内层没有x,y时,它的返回值当然是undefined了(第二三四种情况)。
发布了46 篇原创文章 · 获赞 12 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/yuanfangyoushan/article/details/99706544
今日推荐