Maison > Article > interface Web > Parlons de l'opérateur de spread dans ES6
Cet article vous apporte des connaissances pertinentes sur javascript, qui présente principalement des problèmes liés à l'opérateur d'expansion de S6 a une syntaxe très simple, utilisant trois points pour représenter ".. ." Vous pouvez convertir un tableau en une séquence de paramètres séparés par des virgules. Jetons-y un coup d'œil, j'espère que cela sera utile à tout le monde.
[Recommandations associées : tutoriel vidéo javascript, front-end web]
L'opérateur spread d'ES6, sa syntaxe est très simple, utilisant trois points pour représenter "...". Vous pouvez convertir un tableau en une séquence de paramètres séparés par des virgules.
Il développe l'objet itérable en ses éléments séparés. L'objet dit itérable est tout objet qui peut être parcouru à l'aide de la boucle for of
, tel que : tableau, chaîne, Map <.>, <code>Set
, nœuds DOM
, etc. 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
Syntaxe de base
const nodeList = document.querySelectorAll(".row"); const nodeArray = [...nodeList]; console.log(nodeList); console.log(nodeArray);Cet opérateur est principalement utilisé pour les appels de fonctions
// ES5 a = list[0], rest = list.slice(1) // ES6 [a, ...rest] = listDans le code ci-dessus, les deux lignesarray.push(...items)
etadd(...numbers)
sont toutes deux des appels de fonction. , ils utilisent tous l'opérateur spread. Cet opérateur transforme un tableau en une séquence de paramètres. 🎜Les expressions peuvent également être placées après l'opérateur spread
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 // []🎜 Si l'opérateur spread est suivi d'un tableau vide, cela n'aura aucun effet. 🎜const [...butLast, last] = [1, 2, 3, 4, 5]; // 报错 const [first, ...middle, last] = [1, 2, 3, 4, 5]; // 报错🎜Il existe de nombreuses autres utilisations de l'opérateur spread...🎜1. array
>L'utilisation de la fonction Math.max() pour obtenir la valeur maximale est :
[...'hello'] // [ "h", "e", "l", "l", "o" ]Utilisez la méthode apply en combinaison avec Math.max() :
🎜 Mais si vous souhaitez calculer la valeur maximale dans le tableau, le tableau ne peut évidemment pas être directement utilisé comme paramètre de Math.max(). Nous devons le développer. Avant ES6, nous devions également combiner l'application au processus : 🎜let map = new Map([ [1, 'one'], [2, 'two'], [3, 'three'], ]); let arr = [...map.keys()]; // [1, 2, 3]🎜ES6 peut être facilement étendu à l'aide de l'opérateur spread (...) L'exemple ci-dessus devient : 🎜var go = function*(){ yield 1; yield 2; yield 3; }; [...go()] // [1, 2, 3]2. Application des opérateurs spread
.1. Fusionner des tableaux
🎜 L'opérateur spread nous offre une nouvelle façon de fusionner des tableaux🎜const obj = {a: 1, b: 2}; let arr = [...obj]; // TypeError: Cannot spread non-iterable object🎜 En utilisant l'opérateur spread, vous pouvez facilement fusionner des tableaux Développer dans une liste de paramètres 🎜 rrreee🎜 Dans le code ci-dessus,a3
eta4
sont de nouveaux tableaux fusionnés en utilisant deux méthodes différentes, mais leurs membres sont tous identiques aux tableaux d'origine. Une référence à un membre est une copie superficielle. Si la valeur pointée par la référence est modifiée, elle sera reflétée de manière synchrone dans le nouveau tableau.都 Remarque : ces deux méthodes sont des copies superficielles et vous devez faire attention lors de leur utilisation. 🎜2. Copier le tableau
🎜 Le tableau est un type de données composite. Si vous le copiez directement, vous copiez uniquement le pointeur vers la structure de données sous-jacente au lieu de cloner un tout nouveau tableau. 🎜🎜 ES5 ne peut utiliser des solutions de contournement que pour copier des tableaux. 🎜rrreee🎜 Dans le code ci-dessus,a1
renverra un clone du tableau d'origine. La modification dea2
n'affectera pasa1
. 🎜🎜 L'opérateur spread fournit un moyen simple de copier un tableau. 🎜rrreee🎜 Rappelez-vous : le tableau est toujours obtenu via un pointeur, nous ne copions donc pas le tableau lui-même, nous copions simplement un nouveau pointeur. 🎜3. Convertir le pseudo-tableau en tableau h2 >
🎜L'objetNodeList
est une collection de nœuds, généralement composés de propriétés, telles queNode.childNodes
et de méthodes, telles quedocument.querySelectorAll code> renvoyé. 🎜
像 NodeList 和 arguments 这种伪数组,类似于数组,但不是数组,没有
Array
的所有方法,例如find
、map
、filter
等,但是可以使用forEach()
来迭代可以通过扩展运算符将其转为数组,如下:
const nodeList = document.querySelectorAll(".row"); const nodeArray = [...nodeList]; console.log(nodeList); console.log(nodeArray);注意:使用扩展运算符将伪数组转换为数组有局限性,这个类数组必须得有默认的迭代器且伪可遍历的
4.与解构赋值结合
扩展运算符可以与解构赋值结合起来,用于生成数组
// ES5 a = list[0], rest = list.slice(1) // ES6 [a, ...rest] = list下面是另外一些例子:
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 // []注意:如果将扩展运算符用于数组赋值,只能放在参数的最后一位,否则会报错。
const [...butLast, last] = [1, 2, 3, 4, 5]; // 报错 const [first, ...middle, last] = [1, 2, 3, 4, 5]; // 报错5. 字符串
ES6的扩展语法可以很简单的把一个字符串分割为单独字符的数组:
[...'hello'] // [ "h", "e", "l", "l", "o" ]6.Map 和 Set 结构,Generator 函数
扩展运算符内部调用的是数据结构的 Iterator 接口,因此只要具有 Iterator 接口的对象,都可以使用扩展运算符,比如 Map 结构。
let map = new Map([ [1, 'one'], [2, 'two'], [3, 'three'], ]); let arr = [...map.keys()]; // [1, 2, 3]Generator 函数运行后,返回一个遍历器对象,因此也可以使用扩展运算符。
var go = function*(){ yield 1; yield 2; yield 3; }; [...go()] // [1, 2, 3]上面代码中,变量
go
是一个 Generator 函数,执行后返回的是一个遍历器对象,对这个遍历器对象执行扩展运算符,就会将内部遍历得到的值,转为一个数组。如果对没有 Iterator 接口的对象,使用扩展运算符,将会报错。
const obj = {a: 1, b: 2}; let arr = [...obj]; // TypeError: Cannot spread non-iterable object【相关推荐:javascript视频教程、web前端】
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!