ES6: 函数默认值,不定参数

476 阅读2分钟

这是我参与11月更文挑战的第3天,活动详情查看:2021最后一次更文挑战

默认值

在使用函数的时候,往往会遇到需要给接收的参数指定默认值,ES5中往往这样做

function test(name, age){
    console.log(name || "didi")
    console.log(age || 25)
}
test("jojo")
// jojo
// 25

因为接收到一个name,因此打印接收到的name,age没有接收到,打印25

这样的代码往往能满足大部分需求,但是部分特殊情况,通常0,undefined,null在作为参数时不被认为其存在,那么当age接收到的是0时,依然会打印25

这个时候就需要对可能出现的参数判断一下,于是代码变成了这样

function test(name, age){
    name = typeof(name !== 'undefined') ? name : 'didi'
    age = typeof(age !== 'undefined') ? age : 25
    console.log(name)
    console.log(age)
}
test("jojo", 0)
// jojo
// 0

这样固然能得到预期结果,但是代码太过于繁琐,因此,在ES6中,可以通过默认参数,来进行优化,于是代码可以这样

function test(name='jojo', age=25){
    console.log(name)
    console.log(age)
}
test("jojo", 0)
// jojo
// 0

这样通过指定参数默认值的方式,便能简洁的实现得到预期的结果,这种方式

  1. 如果传入了参数,则是得到传入的参数,传入的参数会覆盖默认值
  2. 如果未传入参数,则是得到指定的默认值
  3. 如果既没指定默认值,又没有传参,那么得到的会是undefined
  4. 如果想第一个参数为默认值,第二个参数为传入值,则把第一个传的参数指定为undefined,比如test(undefined, 25)

不定参数

有时函数并不知道会获取的参数有多少,这个时候需要通过获取不定参数的方式,在ES5中使用隐藏参数arguments来获取,arguments拥有length

function test(){
    console.log(arguments)
    console.log(arguments[0])
    console.log(arguments[1])
}
test("jojo", 0)
// Arguments(2) ['jojo', 0]
// jojo
// 0

而ES6中通过 ... 的剩余参数方式来获取不定参数,且剩余参数和arguments互不影响

function test(...arg){
    console.log(arg)
    console.log(...arg)
}
test("jojo", 0)
// ['jojo', 0]
// jojo 0