了解 ES6 扩展运算符,以及这个强大的 JavaScript 功能的一些实际用途!
扩展运算符是 ES6 引入的 JavaScript 的一项功能, 让您可以访问可迭代对象 的内部。 术语“可迭代对象”实际上只是一种数据类型类别的计算机科学术语。 具体来说:数组、对象字面量和字符串。
是什么让它们“可迭代”? 这些 JavaScript 类型可以以某种顺序方式遍历。 例如,您可以在数组上使用 for 循环,或者使用对象字面量,您可以在循环 中使用 for...。
扩展运算符有效地使您可以访问这些可迭代对象中的“东西”。 让我们看一个例子来说明这意味着什么:
const foo = [ 'hello', 'bonjour', 'konnichiwa' ]; const bar = [...foo]; // the three dots "..." are the spread operator syntax! console.log(bar); // ['hello', 'bonjour', 'konnichiwa'];
变量 bar 得到了 foo 的精确副本! 哇…
const foo = [ <^>'hello', 'bonjour', 'konnichiwa'<^> ] const bar = [...foo]
扩展运算符基本上挖出 foo 数组的内部,并 将值 扩展到 bar 中的新数组。
现在我们有了一个基本的想法,让我们看看展开运算符可能有用的常见任务。
复制可迭代对象
正如我们之前看到的,扩展运算符是复制可迭代对象的最佳方法之一。 有更复杂的方法可以做到这一点,但是扩展运算符的简洁性使它变得非常容易。
const foo = ['hello', 'bonjour', 'konnichiwa']; const bar = ...foo; // uh-oh :<
有点偷偷摸摸地骗了你。 您必须将其放入 bar 中的一组新括号中! 😬
const foo = ['hello', 'bonjour', 'konnichiwa']; const bar = [...foo]; // woohoo! :> console.log(bar); // ['hello', 'bonjour', 'konnichiwa']
使用扩展运算符复制对象字面量与数组没有太大区别。 只要记住 BYOB(带上你自己的括号):
const foo = {
english: 'hello',
french: 'bonjour',
japanese: 'konnichiwa'
};
const bar = {...foo};
console.log(bar);
// { english: 'hello', french: 'bonjour', japanese: 'konnichiwa' }
合并可迭代对象
扩展运算符也可用于从其他几个值组合单个值!
const foo = ['hello', 'bonjour', 'konnichiwa']; const bar = ['gutentag', 'hello-ey']; const baz = [...foo, ...bar]; console.log(baz); // ['hello', 'bonjour', 'konnichiwa', 'gutentag', 'hello-ey']
现在 baz 是 foo 和 bar 的合并值。 您还可以将 spreaded 数组放在另一个数组中:
const foo = ['hello', 'bonjour', 'konnichiwa']; const bar = [...foo, 'gutentag', 'hello-ey']; console.log(bar); // ['hello', 'bonjour', 'konnichiwa', 'gutentag', 'hello-ey']
这就是你训练有素的 JavaScript 直觉可能会认为这看起来很奇怪的地方……但请记住,扩展运算符只是持有“东西”。 你把那些“东西”放在哪里取决于你! 💫
对象字面量如何? 它与合并数组非常相似:
const foo = {
english: 'hello',
french: 'bonjour',
japanese: 'konnichiwa'
};
const bar = {
german: 'gutentag',
canadian: 'hello-ey'
};
const baz = {...foo, ...bar};
console.log(baz);
// { english: 'hello', french: 'bonjour', japanese: 'konnichiwa', german: 'gutentag', canadian: 'hello-ey' }
繁荣! 这曾经是 Object.assign() 的任务,但扩展语法使这更加简洁。
当有重复键时会发生什么?
const foo = {
english: 'hello',
french: 'bonjour',
japanese: 'konnichiwa'
};
const bar = {
english: 'howdy',
german: 'gutentag'
};
const baz = {
...foo,
...bar,
canadian: 'hello-ey',
korean: 'annyeong'
};
console.log(baz);
// { english: 'howdy', french: 'bonjour', japanese: 'konnichiwa', german: 'gutentag', canadian: 'hello-ey', korean: 'annyeong' }
重复的键被覆盖!
请记住,省略号 在变量前面而不是在 之后: ...myVariable 不是 myVariable...
将参数输入函数
您可能很少遇到这种情况,但您也可以使用扩展运算符将参数输入函数。
const cube = [12, 30, 14];
function calcVolume(width, height, depth) {
return width * height * depth;
};
calcVolume(12, 30, 14); // basic
calcVolume.apply(null, cube); // using "apply"
calcVolume(...cube); // using "spread operator"
扩展运算符使将一系列参数输入函数变得非常容易。
你说了一些关于弦乐的事
最后,您还可以将扩展运算符与字符串一起使用,因为它们也被视为可迭代对象(它具有 slice 和 length 函数!)
const foo = "jumanji"; const bar = [...foo]; console.log(bar); // [ "j", "u", "m", "a", "n", "j", "i" ]
除非您开发用于自然语言处理或某种机器学习的软件,否则您可能不需要对字符串使用扩展运算符。 我不确定......但它绝对适用于字符串!
结论
扩展运算符是一项要求很高的功能,已经在 C++ 和 Python 等老式语言中提供,现在它就在这里! 它使一些常见的编程任务非常容易完成,希望您学会了可以使用它的实用方法!
有关扩展运算符的深入文档,请参阅 MDN。