《JavaScript高级程序设计》在讲Function类型时说:
说起来ECMAScript中什么最有意思,我想那莫过于函数了。
今天来看看有意思的地方之一:rest参数。
我们知道,ES6支持类(class)这种写法了:
class A {
constructor(x, y) {
this._x = x;
this._y = y;
}
}
如果是C++,在对象初始化时如果想指定不同的方式来初始化数据成员,可以重载构造函数,然后在定义新对象时,编译器根据实参类型决定使用哪个构造函数。
而JavaScript没有函数重载,如何实现支持多种初始化方式呢?
首先,JS函数的参数与大多数其他语言中函数的参数有所不同,即便刚开始只定义了两个参数,在调用时也未必一定要传两个,可以传一个或者三个。
在函数体内,它可以通过一个对象来获取所有参数,这个对象是:arguments。比如:
function sayHi() {
alert("hello " + arguments[0] + "," + arguments[1]);
}
到了ES6,又引入了rest参数,形式为:...变量名。arguments对象不是数组,只是可以下标访问而已,而rest参数是一个真正的数组。
使用rest参数,上面的构造函数可以这样写:
class A {
constructor(...args) {
if (args.length == 3) {
this._x = args[0];
this._y = args[1];
this._z = args[2];
}
else if (args.length == 2) {
this._x = args[0];
this._y = args[1];
this._z = 0;
}
else {
throw TypeError("args error!");
}
}
}