es6的函数可以定义多个可选参数吗。比如
function sayHello(a:string, b?:string, c?:string){ }
我觉得是不可以的,但看到项目中有这么写的
对 ES5 而言,所有的参数都是可选参数,反而是必选参数的约束要靠开发者自己实现;
ES6 提供了默认参数,比 ES5 进步了不少,但由于 ES6 是向下兼容 ES5 的(ES6 运行时可以运行按照 ES5 标准写的旧代码),所以实际上 ES6 函数所有的参数也还是全部可选,对参数的约束仍旧是靠开发者自己实现;
真正有“必选参数+可选参数”概念的,是 TS ,TS 对此可选参数的静态约束是“可选参数不能放在必选参数前面”,只要符合这个约束即可,对可选参数的数量则不作约束。
而且常见 JS 运行时提供的一些函数,比如Array.prototype.push
、Math.max
、console.log
、setTimeout
等都是有不限数量的可选参数的。
还有一个函数 CanvasRenderingContext2D.prototype.drawImage
非常典型,其重载让人眼花缭乱:
drawImage(image:ImageLike, dx:number, dy:number):void; drawImage(image:ImageLike, dx:number, dy:number, dWidth:number, dHeight:number):void; drawImage(image:ImageLike, sx:number, sy:number, sWidth:number, sHeight
在JS(无论ES6以上还是以下)里,函数被调用时,并不会检查传入的参数数量是否符合定义时的数量。
所以利用这个特性,JS可以实现任意数量的可选参数。
比如定义function func(a, b, c, d)
,你用func(1, 2, 3, 4)
、func(1, 2, 3)
、func(1, 2)
、func(1)
甚至func()
都是合法的。此时缺失的参数,在函数体内的值为undefined
。