一起来聊聊ES6中的扩展运算符

WBOY
Freigeben: 2022-08-08 14:47:25
nach vorne
1602 Leute haben es durchsucht

本篇文章给大家带来了关于javascript的相关知识,其中主要介绍了关于扩展运算符的相关问题,S6的扩展运算符,它的语法很简单,使用三个点号表示“...”。可以将一个数组转为用逗号分隔的参数序列,下面一起来看一下,希望对大家有帮助。

一起来聊聊ES6中的扩展运算符

【相关推荐:javascript视频教程web前端

ES6的扩展运算符,它的语法很简单,使用三个点号表示“...”。可以将一个数组转为用逗号分隔的参数序列。

它将可迭代对象展开到其单独的元素中,所谓的可迭代对象就是任何能用for of循环进行遍历的对象,例如:数组、字符串、MapSetDOM节点等。

基础语法

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
Nach dem Login kopieren

该运算符主要用于函数调用

function push(array, ...items) { array.push(...items); } function add(x, y) { return x + y; } const numbers = [4, 38]; add(...numbers) // 42
Nach dem Login kopieren

上面代码中,array.push(...items)add(...numbers)这两行,都是函数的调用,它们都使用了扩展运算符。该运算符将一个数组,变为参数序列。

扩展运算符后面还可以放置表达式

const arr = [ ...(x > 0 ? ['a'] : []), 'b', ];
Nach dem Login kopieren

如果扩展运算符后面是一个空数组,则不产生任何效果。

[...[], 1] // [1]
Nach dem Login kopieren

扩展运算符还有许多用法...

一、 替代数组的 apply 方法

使用 Math.max() 函数来获取最大值的用法是:

const m = Math.max(1, 2, 3); //结果为3
Nach dem Login kopieren

使用 apply 方法结合 Math.max():

但如果要计算数组里的最大值,显然数组是不能直接作为 Math.max() 的参数,我们需要把它展开。在ES6之前,我们也是需要结合apply来处理:

var arr = [2, 4, 8, 6, 0]; function max(arr) { return Math.max.apply(null, arr); } console.log(max(arr));
Nach dem Login kopieren

ES6使用扩展运算符(...)就很简单就可以展开,上面的例子变为:

var arr = [2, 4, 8, 6, 0]; console.log(Math.max(...arr)); // 3
Nach dem Login kopieren

二、扩展运算符的应用

1. 合并数组

扩展运算符给了我们全新的合并数组的方法

// 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]
Nach dem Login kopieren

使用扩展运算符就可以很简单地把数组展开为参数列表

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
Nach dem Login kopieren

上面代码中,a3a4是用两种不同方法合并而成的新数组,但是它们的成员都是对原数组成员的引用,这就是浅拷贝。如果修改了引用指向的值,会同步反映到新数组。

注意:这两种方法都是浅拷贝,使用的时候需要注意。

2. 拷贝数组

数组是复合的数据类型,直接复制的话,只是复制了指向底层数据结构的指针,而不是克隆一个全新的数组。

ES5 只能用变通方法来复制数组。

const a1 = [1, 2]; const a2 = a1.concat(); a2[0] = 2; a1 // [1, 2]
Nach dem Login kopieren

上面代码中,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: {…}}
Nach dem Login kopieren

记住:数组仍通过指针得到,所以我们并没有复制数组本身,我们复制的只是一个新的指针。

3. 将伪数组转换为数组

NodeList对象是节点的集合,通常是由属性,如Node.childNodes和方法,如document.querySelectorAll返回的。

像 NodeList 和 arguments 这种伪数组,类似于数组,但不是数组,没有Array的所有方法,例如findmapfilter等,但是可以使用forEach()来迭代

可以通过扩展运算符将其转为数组,如下:

const nodeList = document.querySelectorAll(".row"); const nodeArray = [...nodeList]; console.log(nodeList); console.log(nodeArray);
Nach dem Login kopieren

注意:使用扩展运算符将伪数组转换为数组有局限性,这个类数组必须得有默认的迭代器且伪可遍历的

4.与解构赋值结合

扩展运算符可以与解构赋值结合起来,用于生成数组

// ES5 a = list[0], rest = list.slice(1) // ES6 [a, ...rest] = list
Nach 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 kopieren

注意:如果将扩展运算符用于数组赋值,只能放在参数的最后一位,否则会报错。

const [...butLast, last] = [1, 2, 3, 4, 5]; // 报错 const [first, ...middle, last] = [1, 2, 3, 4, 5]; // 报错
Nach dem Login kopieren

5. 字符串

ES6的扩展语法可以很简单的把一个字符串分割为单独字符的数组:

[...'hello'] // [ "h", "e", "l", "l", "o" ]
Nach dem Login kopieren

6.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 kopieren

Generator 函数运行后,返回一个遍历器对象,因此也可以使用扩展运算符。

var go = function*(){ yield 1; yield 2; yield 3; }; [...go()] // [1, 2, 3]
Nach dem Login kopieren

上面代码中,变量go是一个 Generator 函数,执行后返回的是一个遍历器对象,对这个遍历器对象执行扩展运算符,就会将内部遍历得到的值,转为一个数组。

如果对没有 Iterator 接口的对象,使用扩展运算符,将会报错。

const obj = {a: 1, b: 2}; let arr = [...obj]; // TypeError: Cannot spread non-iterable object
Nach dem Login kopieren

【相关推荐:javascript视频教程web前端

Das obige ist der detaillierte Inhalt von一起来聊聊ES6中的扩展运算符. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
es6
Quelle:csdn.net
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!