使用展开运算符时,您将一个变量扩展为更多内容:
var abc = ['a', 'b', 'c'];
var def = ['d', 'e', 'f'];
var alpha = [ ...abc, ...def ];
console.log(alpha)// alpha == ['a', 'b', 'c', 'd', 'e', 'f'];
使用rest参数时,您将函数的所有其余参数折叠成一个数组:
function sum( first, ...others ) {
for ( var i = 0; i < others.length; i++ )
first += others[i];
return first;
}
console.log(sum(1,2,3,4))// sum(1, 2, 3, 4) == 10;
const [a, b, ...c] = [1, 2, 3, 4, 5, 6, 7, 8, 9]
是什么意思? - YukuléléES6有一个新功能——三个点 ...
下面是我们如何使用这些点:
- 作为Rest/Collector/Gather
var [c, ...m] = [1,2,3,4,5]; // m -> [2,3,4,5]
这里 ...m
是一个收集器,它收集其余的参数。当我们在内部编写以下代码时:
var [c, ...m] = [1,2,3,4,5];
JavaScript 执行以下操作
var c = 1,
m = [2, 3, 4, 5];
- 作为传播
var params = [ "hello", true, 7 ];
var other = [ 1, 2, ...params ]; // other => [1,2,"hello", true, 7]
在这里,...params
展开操作符将其所有元素都添加到 other
中。
JavaScript 内部执行以下操作:
var other = [1, 2].concat(params);
在JavaScript中,...
是具有重载功能的,根据运算符使用的位置不同,它会执行不同的操作:
Rest参数语法:
function rest(first, second, ...remainder) {
console.log(remainder);
}
// 3, 4 ,5 are the remaining parameters and will be
// merged together in to an array called remainder
rest(1, 2, 3, 4, 5);
扩展语法:
// example from MDN:
function sum(x, y, z) {
return x + y + z;
}
const numbers = [1, 2, 3];
// the numbers array will be spread over the
// x y z parameters in the sum function
console.log(sum(...numbers));
// the numbers array is spread out in the array literal
// before the elements 4 and 5 are added
const newNumbers = [...numbers, 4, 5];
console.log(newNumbers);
Javascript中的三个点 ( ...
) 运算符可以有两种不同的用法:
var days = ["Sat", "Sun", "Mon", "Tue", "Wed", "Thu", "Fri"];
const [sat, sun, ...weekdays] = days;
console.log(sat); // "Sat"
console.log(sun); // "Sun"
console.log(weekdays); // ["Mon", "Tue", "Wed", "Thu", "Fri"]
var weekdays = ["Mon", "Tue", "Wed", "Thu", "Fri"];
var days = [...weekdays, "Sat", "Sun"];
console.log(days) // ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]
在ES6中新增了这三个点...
,它有两个含义,分别是展开运算符和剩余参数
展开运算符:您可以使用三个点来展开可迭代对象
,我指的是数组
、字符串
等作为参数。例如Math.max()
函数期望不确定数量的参数,因此您可以使用展开运算符将元素展开为Math.max()
函数的参数。以下是mdn的示例:
console.log(Math.max(1, 3, 2));
// expected output: 3
console.log(Math.max(-1, -3, -2));
// expected output: -1
var array1 = [1, 3, 2];
console.log(Math.max(...array1));
// expected output: 3
另一个使用案例是添加,例如有以下数组:
const videoGames = ['mario galaxy', 'zelda wind waker', 'ico'];
您可以将它添加到另一个数组中
const favoritesVideoGames = ['Shadow of the colosus', ...videoGames];
favoritesVideoGames
的值为。[ 'Shadow of the colosus', 'mario galaxy', 'zelda wind waker', 'ico' ]
关于Rest参数,这里是MDN的定义:
Rest参数语法允许我们将不确定数量的参数表示为数组。
这意味着您可以将多个元素打包到单个元素中。
这里是来自MDN的一个示例:
function sum(...theArgs) {
return theArgs.reduce((previous, current) => {
return previous + current;
});
}
console.log(sum(1, 2, 3));
// expected output: 6
console.log(sum(1, 2, 3, 4));
// expected output: 10
易记的............
如果三个点(...)在左侧,它是 Rest 参数,如果三个点在右侧,它是 Spread 参数。
记住LRS按字母顺序是 L 然后 R 再是 S
const [a,b,...c] = [1,2,3,4,5] // (left) rest
const [d,e] = [1, ...c] // (right) spread
>>> def func(first, *others):
... return [first, *others]
>>> func('a', 'b', 'c')
['a', 'b', 'c']
rest
和spread
之间的区别,这并不能满足提问者的需求。 - josh1978考虑3种情况
1] 不使用任何运算符
function add(x, y) {
return x + y;
}
add(1, 2, 3, 4, 5) // returns 3 (function will takes first 2 arg only)
2] 带有剩余运算符
function add(...args) {
let result = 0;
for (let arg of args) result += arg;
return result
}
add(1) // returns 1
add(1,2) // returns 3
add(1, 2, 3, 4, 5) // returns 15
- 我们可以将任意数量的参数收集到一个数组中
3] 使用展开运算符
const arr = ["Joy", "Wangari", "Warugu"];
const newArr = ["joykare", ...arr];
The value of newArr will be [ 'joykare', 'Joy', 'Wangari', 'Warugu' ]
另一个
function add(a, b, c) {
return a + b + c ;
}
const args = [1, 2, 3];
add(...args);
-We have been using arrays to demonstrate the spread operator,
but any iterable also works. So, if we had a
string const str = 'joykare', [...str] translates to [ 'j', 'o', 'y', 'k', 'a', 'r', 'e' ]
关于这个我不理解在JavaScript中如何传递函数并返回参数
函数是一组指令,它接受一些输入并处理它们并返回结果。
在这里,我们有一个数组[1, 2, 3, 4, 5, 6],filter函数迭代每个元素并将每个元素传递给positive函数,如果它是偶数,则返回该数字,否则跳过它。
跟踪:
1 => Filter(1) => positive(1) => skips 1,
2 => Filter(2) => positive(2) => returns 2,
3 => Filter(3) => positive(3) => skips 3,
...
6 => Filter(6) => positive(6) => returns 6
因此结果为 [2, 4, 6]