Dieser Artikel vermittelt Ihnen relevantes Wissen über Javascript, in dem hauptsächlich verwandte Themen zum Erweiterungsoperator vorgestellt werden. Der Erweiterungsoperator von S6 hat eine sehr einfache Syntax und verwendet drei Punkte zur Darstellung von „..“. Sie können ein Array in eine durch Kommas getrennte Parametersequenz umwandeln. Schauen wir uns das an. Ich hoffe, es wird für alle hilfreich sein.
[Verwandte Empfehlungen: Javascript-Video-Tutorial, Web-Frontend]
Die Syntax des Spread-Operators von ES6 ist sehr einfach und verwendet drei Punkte zur Darstellung von „…“. Sie können ein Array in eine durch Kommas getrennte Folge von Parametern konvertieren.
Es erweitert das iterierbare Objekt in seine einzelnen Elemente. Das sogenannte iterierbare Objekt ist jedes Objekt, das mit der for of
-Schleife durchlaufen werden kann, wie zum Beispiel: Array, String, Map -, <code>Set
-, DOM
-Knoten usw. for of
循环进行遍历的对象,例如:数组、字符串、Map
、Set
、DOM
节点等。
var array = [1,2,3,4]; console.log(...array);//1 2 3 4 var str = "String"; console.log(...str);//S t r i n g
function push(array, ...items) { array.push(...items); } function add(x, y) { return x + y; } const numbers = [4, 38]; add(...numbers) // 42
上面代码中,array.push(...items)
和add(...numbers)
这两行,都是函数的调用,它们都使用了扩展运算符。该运算符将一个数组,变为参数序列。
const arr = [ ...(x > 0 ? ['a'] : []), 'b', ];
如果扩展运算符后面是一个空数组,则不产生任何效果。
[...[], 1] // [1]
扩展运算符还有许多用法...
const m = Math.max(1, 2, 3); //结果为3
但如果要计算数组里的最大值,显然数组是不能直接作为 Math.max() 的参数,我们需要把它展开。在ES6之前,我们也是需要结合apply来处理:
var arr = [2, 4, 8, 6, 0]; function max(arr) { return Math.max.apply(null, arr); } console.log(max(arr));
ES6使用扩展运算符(...)就很简单就可以展开,上面的例子变为:
var arr = [2, 4, 8, 6, 0]; console.log(Math.max(...arr)); // 3
扩展运算符给了我们全新的合并数组的方法
// ES5 apply 写法 var arr1 = [0, 1, 2]; var arr2 = [3, 4, 5]; Array.prototype.push.apply(arr1, arr2); //arr1 [0, 1, 2, 3, 4, 5]
使用扩展运算符就可以很简单地把数组展开为参数列表
const a1 = [{ foo: 1 }]; const a2 = [{ bar: 2 }]; const a3 = a1.concat(a2); const a4 = [...a1, ...a2]; a3[0] === a1[0] // true a4[0] === a1[0] // true
上面代码中,a3
和a4
是用两种不同方法合并而成的新数组,但是它们的成员都是对原数组成员的引用,这就是浅拷贝。如果修改了引用指向的值,会同步反映到新数组。
注意:这两种方法都是浅拷贝,使用的时候需要注意。
数组是复合的数据类型,直接复制的话,只是复制了指向底层数据结构的指针,而不是克隆一个全新的数组。
ES5 只能用变通方法来复制数组。
const a1 = [1, 2]; const a2 = a1.concat(); a2[0] = 2; a1 // [1, 2]
上面代码中,a1
会返回原数组的克隆,再修改a2
就不会对a1
产生影响。
扩展运算符提供了复制数组的简便写法。
//拷贝数组 var array0 = [1,2,3]; var array1 = [...array0]; console.log(array1);//[1, 2, 3] //拷贝数组 var obj = { age:1, name:"lis", arr:{ a1:[1,2] } } var obj2 = {...obj}; console.log(obj2);//{age: 1, name: "lis", arr: {…}}
记住:数组仍通过指针得到,所以我们并没有复制数组本身,我们复制的只是一个新的指针。
NodeList
对象是节点的集合,通常是由属性,如Node.childNodes
和方法,如document.querySelectorAll
Grundlegende Syntax
const nodeList = document.querySelectorAll(".row"); const nodeArray = [...nodeList]; console.log(nodeList); console.log(nodeArray);Nach dem Login kopierenNach dem Login kopierenDieser Operator wird hauptsächlich für Funktionsaufrufe verwendet
Im obigen Code sind die beiden Zeilen// ES5 a = list[0], rest = list.slice(1) // ES6 [a, ...rest] = listNach dem Login kopierenNach dem Login kopierenarray.push(...items)
undadd(...numbers)
beide Funktionsaufrufe. , sie alle verwenden den Spread-Operator. Dieser Operator wandelt ein Array in eine Folge von Parametern um. 🎜Ausdrücke können auch nach dem Spread-Operator platziert werden
🎜 Wenn auf den Spread-Operator ein leeres Array folgt, hat dies keine Auswirkung. 🎜const [first, ...rest] = [1, 2, 3, 4, 5]; first // 1 rest // [2, 3, 4, 5] const [first, ...rest] = []; first // undefined rest // [] const [first, ...rest] = ["foo"]; first // "foo" rest // []Nach dem Login kopierenNach dem Login kopieren🎜Es gibt viele andere Verwendungsmöglichkeiten des Spread-Operators...🎜const [...butLast, last] = [1, 2, 3, 4, 5]; // 报错 const [first, ...middle, last] = [1, 2, 3, 4, 5]; // 报错Nach dem Login kopierenNach dem Login kopieren1 Die Apply-Methode zum Ersetzen array
>Die Verwendung der Funktion Math.max() zum Erhalten des Maximalwerts ist:
[...'hello'] // [ "h", "e", "l", "l", "o" ]Nach dem Login kopierenNach dem Login kopierenVerwenden Sie die apply-Methode in Verbindung mit Math.max():
🎜 Wenn Sie jedoch den Maximalwert im Array berechnen möchten, kann das Array dies offensichtlich nicht direkt als Parameter von Math.max() verwendet werden. Wir müssen es erweitern. Vor ES6 mussten wir auch „Apply to Process“ kombinieren: 🎜🎜ES6 kann einfach mit dem Spread-Operator (...) erweitert werden. Das obige Beispiel wird zu: 🎜let map = new Map([ [1, 'one'], [2, 'two'], [3, 'three'], ]); let arr = [...map.keys()]; // [1, 2, 3]Nach dem Login kopierenNach dem Login kopierenvar go = function*(){ yield 1; yield 2; yield 3; }; [...go()] // [1, 2, 3]Nach dem Login kopierenNach dem Login kopieren2. Anwendung von Spread-Operatoren
1. Arrays zusammenführen
🎜 Der Spread-Operator bietet uns eine neue Möglichkeit, Arrays zusammenzuführen🎜🎜 Mit dem Spread-Operator können Sie Arrays ganz einfach zu einer Parameterliste erweitern 🎜 rrreee🎜 Im obigen Code sindconst obj = {a: 1, b: 2}; let arr = [...obj]; // TypeError: Cannot spread non-iterable objectNach dem Login kopierenNach dem Login kopierena3
unda4
neue Arrays, die mit zwei verschiedenen Methoden zusammengeführt wurden, aber ihre Mitglieder sind alle mit den ursprünglichen Arrays identisch. Ein Verweis auf ein Mitglied ist eine oberflächliche Kopie. Wenn der Wert, auf den die Referenz zeigt, geändert wird, wird er synchron im neuen Array widergespiegelt.都 Hinweis: Bei diesen beiden Methoden handelt es sich um flache Kopien, bei deren Verwendung Vorsicht geboten ist. 🎜2. Array kopieren
🎜 Array ist ein zusammengesetzter Datentyp. Wenn Sie es direkt kopieren, kopieren Sie nur den Zeiger auf die zugrunde liegende Datenstruktur, anstatt eine brandneue zu klonen Array. 🎜🎜 ES5 kann nur Workarounds zum Kopieren von Arrays verwenden. 🎜rrreee🎜 Im obigen Code gibta1
einen Klon des ursprünglichen Arrays zurück. Das Ändern vona2
hat keine Auswirkungen aufa1
. 🎜🎜 Der Spread-Operator bietet eine einfache Möglichkeit, ein Array zu kopieren. 🎜rrreee🎜 Denken Sie daran: Das Array wird immer noch über einen Zeiger erhalten, wir kopieren also nicht das Array selbst, sondern kopieren einfach einen neuen Zeiger. 🎜3. Pseudo-Array in Array konvertieren h2 >
🎜NodeList
-Objekt ist eine Sammlung von Knoten, die normalerweise aus Eigenschaften wieNode.childNodes
und Methoden wiedocument.querySelectorAll besteht. code> zurückgegeben. 🎜
像 NodeList 和 arguments 这种伪数组,类似于数组,但不是数组,没有
Array
的所有方法,例如find
、map
、filter
等,但是可以使用forEach()
来迭代可以通过扩展运算符将其转为数组,如下:
const nodeList = document.querySelectorAll(".row"); const nodeArray = [...nodeList]; console.log(nodeList); console.log(nodeArray);Nach dem Login kopierenNach dem Login kopieren注意:使用扩展运算符将伪数组转换为数组有局限性,这个类数组必须得有默认的迭代器且伪可遍历的
4.与解构赋值结合
扩展运算符可以与解构赋值结合起来,用于生成数组
// ES5 a = list[0], rest = list.slice(1) // ES6 [a, ...rest] = listNach dem Login kopierenNach dem Login kopieren下面是另外一些例子:
const [first, ...rest] = [1, 2, 3, 4, 5]; first // 1 rest // [2, 3, 4, 5] const [first, ...rest] = []; first // undefined rest // [] const [first, ...rest] = ["foo"]; first // "foo" rest // []Nach dem Login kopierenNach dem Login kopieren注意:如果将扩展运算符用于数组赋值,只能放在参数的最后一位,否则会报错。
const [...butLast, last] = [1, 2, 3, 4, 5]; // 报错 const [first, ...middle, last] = [1, 2, 3, 4, 5]; // 报错Nach dem Login kopierenNach dem Login kopieren5. 字符串
ES6的扩展语法可以很简单的把一个字符串分割为单独字符的数组:
[...'hello'] // [ "h", "e", "l", "l", "o" ]Nach dem Login kopierenNach dem Login kopieren6.Map 和 Set 结构,Generator 函数
扩展运算符内部调用的是数据结构的 Iterator 接口,因此只要具有 Iterator 接口的对象,都可以使用扩展运算符,比如 Map 结构。
let map = new Map([ [1, 'one'], [2, 'two'], [3, 'three'], ]); let arr = [...map.keys()]; // [1, 2, 3]Nach dem Login kopierenNach dem Login kopierenGenerator 函数运行后,返回一个遍历器对象,因此也可以使用扩展运算符。
var go = function*(){ yield 1; yield 2; yield 3; }; [...go()] // [1, 2, 3]Nach dem Login kopierenNach dem Login kopieren上面代码中,变量
go
是一个 Generator 函数,执行后返回的是一个遍历器对象,对这个遍历器对象执行扩展运算符,就会将内部遍历得到的值,转为一个数组。如果对没有 Iterator 接口的对象,使用扩展运算符,将会报错。
const obj = {a: 1, b: 2}; let arr = [...obj]; // TypeError: Cannot spread non-iterable objectNach dem Login kopierenNach dem Login kopieren【相关推荐:javascript视频教程、web前端】
Das obige ist der detaillierte Inhalt vonLassen Sie uns über den Spread-Operator in ES6 sprechen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!