ES6의 스프레드 연산자에 대해 이야기해 봅시다.

WBOY
풀어 주다: 2022-08-08 14:47:25
앞으로
1602명이 탐색했습니다.

이 기사에서는 확장 연산자와 관련된 문제를 주로 소개하는javascript에 대한 관련 지식을 제공합니다. S6의 확장 연산자는 ".."을 나타내는 세 개의 점을 사용하는 매우 간단한 구문을 가지고 있습니다. 배열을 쉼표로 구분된 매개변수 시퀀스로 변환할 수 있으니 살펴보겠습니다. 모두에게 도움이 되기를 바랍니다.

ES6의 스프레드 연산자에 대해 이야기해 봅시다.

[관련 권장 사항:javascript 비디오 튜토리얼,web front-end]

ES6의 스프레드 연산자는 구문이 매우 간단하며 점 3개를 사용하여 "..."을 나타냅니다. 배열을 쉼표로 구분된 매개변수 시퀀스로 변환할 수 있습니다.

반복 가능한 객체를 별도의 요소로 확장합니다. 소위 반복 가능한 객체는for of루프를 사용하여 탐색할 수 있는 모든 객체입니다(예: 배열, 문자열,Map , Set,DOM노드 등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
로그인 후 복사

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

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]
로그인 후 복사

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

一、 替代数组的 apply 方法

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

const m = Math.max(1, 2, 3); //结果为3
로그인 후 복사

使用 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));
로그인 후 복사

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

var arr = [2, 4, 8, 6, 0]; console.log(Math.max(...arr)); // 3
로그인 후 복사

二、扩展运算符的应用

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]
로그인 후 복사

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

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
로그인 후 복사

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

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

2. 拷贝数组

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

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: {…}}
로그인 후 복사

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

3. 将伪数组转换为数组

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

기본 구문

const nodeList = document.querySelectorAll(".row"); const nodeArray = [...nodeList]; console.log(nodeList); console.log(nodeArray);
로그인 후 복사
로그인 후 복사

이 연산자는 주로 함수 호출에 사용됩니다.

// ES5 a = list[0], rest = list.slice(1) // ES6 [a, ...rest] = list
로그인 후 복사
로그인 후 복사
위 코드에서 array.push(...items)add(...numbers)두 줄은 모두 함수 호출입니다. 그들은 모두 스프레드 연산자를 사용합니다. 이 연산자는 배열을 일련의 매개변수로 변환합니다.

표현식은 스프레드 연산자 뒤에도 배치할 수 있습니다.

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]; // 报错
로그인 후 복사
로그인 후 복사
스프레드 연산자는 다른 용도로 많이 사용됩니다...

1. 배열

Math.max() 함수를 사용하여 최대값을 얻는 방법은 다음과 같습니다.

[...'hello'] // [ "h", "e", "l", "l", "o" ]
로그인 후 복사
로그인 후 복사

Math.max()와 함께 Apply 메소드를 사용하세요:

하지만 배열의 최대값을 계산하려는 경우 분명히 배열은 이를 수행할 수 없습니다. Math.max()의 매개변수로 직접 사용되어야 합니다. ES6 이전에는 프로세스에 적용을 결합해야 했습니다.
let map = new Map([ [1, 'one'], [2, 'two'], [3, 'three'], ]); let arr = [...map.keys()]; // [1, 2, 3]
로그인 후 복사
로그인 후 복사
ES6은 스프레드 연산자(...)를 사용하여 쉽게 확장할 수 있습니다. 위의 예는 다음과 같습니다:
var go = function*(){ yield 1; yield 2; yield 3; }; [...go()] // [1, 2, 3]
로그인 후 복사
로그인 후 복사

2. 스프레드 연산자 적용

1. 배열 병합

스프레드 연산자는 배열을 병합하는 새로운 방법을 제공합니다
const obj = {a: 1, b: 2}; let arr = [...obj]; // TypeError: Cannot spread non-iterable object
로그인 후 복사
로그인 후 복사
스프레드 연산자를 사용하면 배열을 쉽게 병합할 수 있습니다. 매개변수 목록으로 확장하세요 rrreee 위 코드에서 a3a4는 두 가지 다른 방법을 사용하여 병합된 새 배열이지만 해당 멤버는 모두 원래 배열과 동일합니다. 멤버에 대한 참조는 다음과 같습니다. 얕은 사본. 참조가 가리키는 값이 수정되면 새 배열에 동기적으로 반영됩니다. tour 참고: 이 두 가지 방법은 얕은 복사이므로 사용 시 주의가 필요합니다.

2. 배열 복사

배열은 복합 데이터 유형입니다. 직접 복사하면 새로운 것을 복제하는 대신 기본 데이터 구조에 포인터만 복사합니다. 정렬. ES5는 배열을 복사하기 위한 해결 방법만 사용할 수 있습니다. rrreee 위 코드에서 a1은 원래 배열의 복제본을 반환합니다. a2를 수정해도 a1에는 영향을 미치지 않습니다. 스프레드 연산자는 배열을 복사하는 간단한 방법을 제공합니다. rrreee 기억하세요: 배열은 여전히 포인터를 통해 얻어지므로 배열 자체를 복사하지 않고 새 포인터만 복사합니다.

3. 의사 배열을 배열로 변환h2 >
NodeList개체는 일반적으로 Node.childNodes와 같은 속성과 document.querySelectorAll과 같은 메서드로 구성된 노드 컬렉션입니다. 코드>가 반환되었습니다.

像 NodeList 和 arguments 这种伪数组,类似于数组,但不是数组,没有Array的所有方法,例如findmapfilter等,但是可以使用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前端

위 내용은 ES6의 스프레드 연산자에 대해 이야기해 봅시다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
es6
원천:csdn.net
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!