很多人把 这三个点叫做 Rest 参数 ,我百思不得其解,对照了各种翻译之后,恍然大悟,应该翻译为剩余,剩下的,再引申为"等等...,剩下的这些省略的数据" 最为恰当。... 它出现的场景,这每个点都代表了,一个同维度,各自平等的一组连续的数据,仅此而已。
虽是一家之言,但也算自圆其说。愿各位有所收获,便是极好的。
... 等等等 三个点 ... : 使用场景一:处理 ... rest 形参问题。
看一个例子:
- function calculate(operator){
- if(operator === "+"){
- let result = 0; // 业务逻辑:加法基础数 0
- for(let i = 1;i<arguments.length;i++){
- // result = result + arguments[i];
- result += arguments[i];
- }
- return result;
- }
- else if(operator === "*"){
- let result = 1; // 业务逻辑:乘法基础数 1
- for(let i = 1;i<arguments.length;i++){
- // result = result + arguments[i];
- result *= arguments[i];
- }
- return result;
- }
- }
-
- let calculateResult = calculate("*",1,2,3,4,5,6);
- console.log(calculateResult);
无论function中定义了多少形参,我们在函数中都可以用这arguments 来接收,这个arguments属于函数的系统变量,无须你自己声明处理逻辑。
吐槽1:由于前头的第一个形参被我们自己声明占用了,不得已我们剩下的那些参数 即调用者传入的参数的arguments索引只能从1开始,这个坑要程序员根据自己实际情况,来编码指定开始索引,费脑子易掉头发。
吐槽2:调用者从形参上看不出来,这个函数是可以接受任意参数的参数的。一个脑筋没转过来,可能就不知道怎么用了。
针对以上问题,ES6 引入了 ... 三个点点——等等剩余参数,官方叫它Rest参数。
- function calculate(operator,...restUserData){
- if(operator === "+"){
- let result = 0; // 业务逻辑:加法基础数 0
- for(let i = 0 ;i
length;i++){ - result+=restUserData[i];
- }
- return result;
- }
- else if(operator === "*"){
- let result = 1; // 业务逻辑:乘法基础数 1
- for (let elementDatum of restUserData) {
- result *= elementDatum
- }
- return result;
- }
- }
-
- let calculateResult2 = calculate("*",1,2,3,4,5,6);
- console.log(calculateResult2);
累加累乘的数据,就是遍历剩下用户传入的那些rest等等的参数,这时候就无须考虑索引问题了。所以我第二个for循环,索性就写了一个和索引无关的 for-of 循环。
... 等等等 三个点 ... : 使用场景二:压扁一个引用类型的数据的场景。
说到引用类型的数据,做为一个程序员,应该第一时间在脑子中浮现应该就是数组和对象了吧。
很多地方都叫它展开运算符,我不得不吐槽,翻译本身也成为了我们学习者不可逾越的障碍,如果一个翻译不好,就会有数以亿计的人,一代一代的人,不停的在一个知识点里,来回的掉坑。其实我看来,叫它Rest依然合适,等等这些省略了的数据,这层意思,依然适合对引用类型的数据,数组和对象。
- let a = [1,2,3];
- console.log(calculate('*',...a)) ; // 等价于 calculate('*',1,2,3)
这里的等... 就有一个数据 press flat data,碾平展开 的效果。同样适用于对象:
- let father = {
- species:'人类',
- planet:'地球',
- language:'汉语'
- }
-
- let son = {
- ...father,name:'张三'
- }
意思就是说:...father 身上 “等等... 这些剩下的,省略的” 优秀的属性,也集中到son这个对象身上来了。这样翻译rest是不是毫无违和感。此处要特别注意的是:...出现在定义对象的时候,无须在意rest变量 编码前后顺序,但是出现在方法形参的时候一定要是最后一个,这个仅就是一个语言规范,没什么要解释的。
自圆其说的一家之言,愿各位有所收获。