> 웹 프론트엔드 > JS 튜토리얼 > JavaScript에서 구조 분해를 사용하는 5가지 방법

JavaScript에서 구조 분해를 사용하는 5가지 방법

青灯夜游
풀어 주다: 2020-11-30 18:00:08
앞으로
8714명이 탐색했습니다.

JavaScript에서 구조 분해를 사용하는 5가지 방법

객체 속성을 읽고 배열 항목에 액세스하는 것은 일반적인 작업입니다. 할당을 삭제하면 이러한 작업이 더 쉽고 깔끔해집니다. 이 기사에서는 기본 사용법 외에도 JavaScript에서 구조 분해의 5가지 흥미로운 사용법을 소개합니다.

1. 변수 교환

일반적으로 두 변수를 교환하는 방법에는 추가 임시 변수가 필요합니다. 예를 살펴보겠습니다.

let a = 1;
let b = 2;
let temp;

temp = a;
a = b;
b = temp;

a; // => 2
b; // => 1
로그인 후 복사

temp는 먼저 저장하는 임시 변수입니다. a의 값입니다. 그런 다음 b 값을 a에 할당하고 temp 값을 b에 할당합니다. temp是一个临时变量,它先保存a的值。然后把b的值赋值给a,接着将temp值赋给 b

如果使用解构的方式会更简单,不需要什么鬼的 temp 变量。

let a = 1;
let b = 2;

[a, b] = [b, a];

a; // => 2
b; // => 1
로그인 후 복사

[a,b] = [b,a]是解构赋值,右边,创建了一个数组[b, a],即[2,1]。这个数组2被赋值了给a,1被赋值给了b

虽然这种方式也创建了临时数组,但这种方式给看起来至少更简洁,使用解构咱们还可以交换2个以上的变量。

let zero = 2;
let one = 1;
let two = 0;

[zero, one, two] = [two, one, zero];

zero; // => 0
one;  // => 1
two;  // => 2
로그인 후 복사

2. 访问数组中元素

有种场景,咱们可能有一个为空的项数组。并且希望访问数组的第一个、第二个或第n个项,但如果该项不存在,则使用指定默认值。

通常会使用数组的length属性来判断

const colors = [];

let firstColor = 'white';
if (colors.length > 0) {
 firstColor = colors[0];
}

firstColor; // => 'white'
로그인 후 복사

使用数组解构,可以更简洁的实现同样的效果:

const colors = [];

const [firstColor = 'white'] = colors;

firstColor; // => 'white'
로그인 후 복사

const [firstColor = 'white'] = colors 解构将colors数组的第一个元素赋给firstColor变量。如果数组在索引0处没有任何元素,则分配“white”默认值。

当然还可以更灵活,如果只想访问第二个元素,可以这么做。

const colors = [];

const [, secondColor = 'black'] = colors;

secondColor; // => 'black'
로그인 후 복사

注意解构左侧的逗号:它表示忽略第一个元素,secondColor使用colors数组中索引为1的元素进行赋值。

3.不可变操作

当我开始使用ReactRedux时,被迫编写了一些遵守不可变性的代码。虽然一开始有些困难,但后来我看到了它的好处:更容易处理单向数据流。

不变性要求不能改变原始对象。幸运的是,解构可以以不可变的方式轻松实现某些操作。

const numbers = [1, 2, 3];

const [, ...fooNumbers] = numbers;

fooNumbers; // => [2, 3]
numbers; // => [1, 2, 3]
로그인 후 복사

解构 [, ... fooNumbers] = numbers创建一个新的数组fooNumbersfooNumbers 包含 numbers 元素,除了第一个元素。

numbers 数组没有发生变化,保持操作不变性。

以同样不可变的方式,可以从对象中删除属性,接着试着从对象big中删除foo属性:

const big = {
 foo: 'value Foo',
 bar: 'value Bar'
};

const { foo, ...small } = big;

small; // => { bar: 'value Bar' }
big; // => { foo: 'value Foo', bar: 'value Bar' }
로그인 후 복사

4.解构 iterables

在前面几个例子中,对数组使用了解构,但是咱们可以对任何实现可迭代协议( iterable protocol)的对象进行解构。

许多原生基本类型和对象都是可迭代的: array, string, typed arrays, setmap

如果不想局限于基本类型,通过实现可迭代协议,可以定制解构逻辑。

movies包含一个movie对象列表。在解构movies时,将title作为字符串获取是非常棒的。让咱们实现一个自定义迭代器。

const movies = {
  list: [
    { title: 'Heat' }, 
    { title: 'Interstellar' }
  ],
  [Symbol.iterator]() {
    let index = 0;
    return {
      next: () => {
        if (index < this.list.length) {
          const value = this.list[index++].title;
          return { value, done: false };
        }
        return { done: true };
      }
    };
  }
};

const [firstMovieTitle] = movies;
console.log(firstMovieTitle); // => 'Heat'
로그인 후 복사

movies对象通过定义Symbol.iterator方法来实现可迭代协议,迭代器迭代title

遵循iterable协议允许将movies对象分解为title,具体方法是读取第一个moviestitle:const [firstMovieTitle] = movies

5.解构动态属性

根据经验,通过属性对对象进行解构比数组解构更常见。

对象的解构看起来很更简单:

const movie = { title: 'Heat' };

const { title } = movie;

title; // => 'Heat'
로그인 후 복사

const {title} = movie创建一个变量title,并将属性movie.title的值赋给它。

到对象解构时,我有点惊讶于咱们不必静态地知道属性名,可以使用动态属性名称来解构对象。

为了了解动态解构如何工作的,编写一个greet函数:

function greet(obj, nameProp) {
 const { [nameProp]: name = 'Unknown' } = obj;
 return `Hello, ${name}!`;
}

greet({ name: 'Batman' }, 'name'); // => 'Hello, Batman!'
greet({ }, 'name'); // => 'Hello, Unknown!'
로그인 후 복사

使用2个参数调用greet() 函数:对象和属性名称。

greet()内部,解构赋值const {[nameProp]:name ='Unknown'} = obj使用方括号的形式 [nameProp]读取动态属性名称,name变量接收动态属性值。

更好的做法是,如果属性不存在,可以指定默认值“Unknown

구조 분해를 사용하면 더 간단할 것입니다. temp 변수가 필요하지 않습니다. 🎜rrreee🎜[a, b] = [b, a]는 오른쪽에 배열 [b, a]가 생성됩니다. [2 ,1]. 이 배열 2a에 할당되고 1은 b에 할당됩니다. 🎜🎜이 방법은 임시 배열도 생성하지만 구조 분해를 사용하면 2개 이상의 변수를 교환할 수도 있어 최소한 더 간결해 보입니다. 🎜rrreee🎜🎜2. 배열의 요소에 액세스🎜🎜🎜빈 항목 배열이 있을 수 있는 시나리오가 있습니다. 배열의 첫 번째, 두 번째 또는 n번째 항목에 액세스하려고 하지만 해당 항목이 없으면 지정된 기본값을 사용합니다. 🎜🎜일반적으로 배열의 length 속성은 🎜rrreee🎜를 결정하는 데 사용됩니다. 배열 구조 분해를 사용하면 동일한 효과를 더 간결하게 얻을 수 있습니다. 🎜rrreee🎜const [firstColor = 'white'] = colors 구조 분해는 colors 배열의 첫 번째 요소를 firstColor 변수에 할당합니다. 배열의 인덱스 0에 요소가 없으면 "white" 기본값이 할당됩니다. 🎜🎜물론 두 번째 요소에만 액세스하려는 경우에는 이렇게 할 수 있습니다. 🎜rrreee🎜해체 왼쪽에 있는 쉼표에 주의하세요. 이는 첫 번째 요소를 무시하고 colors 배열에서 colors 인덱스가 있는 요소를 secondColor 할당. 🎜🎜🎜3. 불변 연산🎜🎜🎜ReactRedux를 사용하기 시작했을 때 불변성을 존중하는 코드를 작성해야 했습니다. 처음에는 조금 어려웠지만 나중에는 단방향 데이터 흐름을 처리하기가 더 쉬워졌다는 이점을 확인했습니다. 🎜🎜불변성은 원래 객체가 변경될 수 없음을 요구합니다. 다행스럽게도 구조 분해를 사용하면 특정 작업을 불변 방식으로 쉽게 구현할 수 있습니다. 🎜rrreee🎜[, ... fooNumbers] = 숫자를 구조화하면 숫자를 포함하는 새로운 배열 fooNumbers, fooNumbers가 생성됩니다. > 요소(첫 번째 요소 제외) 🎜🎜numbers 배열은 변경되지 않았으며 작업도 변경되지 않은 상태로 유지됩니다. 🎜🎜동일한 불변 방식으로 객체에서 속성을 삭제한 다음 big 객체에서 foo 속성을 ​​삭제해 볼 수 있습니다. 🎜rrreee🎜🎜4. iterables🎜 🎜🎜이전 예제에서는 배열에 구조 분해가 사용되었지만 반복 가능 프로토콜을 구현하는 모든 객체를 구조 분해할 수 있습니다. 🎜🎜배열, 문자열, 유형 배열, set 등 다양한 기본 기본 유형과 객체가 반복 가능합니다. >지도. 🎜🎜기본 유형으로 제한되지 않으려면 반복 가능한 프로토콜을 구현하여 구조 분해 논리를 사용자 정의할 수 있습니다. 🎜🎜movies에는 movie 개체 목록이 포함되어 있습니다. 영화를 분해할 때 제목을 문자열로 가져오는 것이 좋습니다. 사용자 정의 반복자를 구현해 보겠습니다. 🎜rrreee🎜 movies 객체는 Symbol.iterator 메서드를 정의하여 반복 가능한 프로토콜을 구현하고 반복자는 title을 반복합니다. 🎜🎜반복 가능한 프로토콜을 따르면 첫 번째 movies titlemovies 개체를 title로 분해할 수 있습니다. /code>:const [firstMovieTitle] = 영화. 🎜🎜🎜5. 동적 속성 분해 🎜🎜🎜 경험상, 속성별로 객체를 분해하는 것이 배열 분해보다 더 일반적입니다. 🎜🎜객체의 구조 분해는 매우 간단해 보입니다. 🎜rrreee🎜const {title} = movie변수 title를 만들고 movie.title 속성을 설정합니다. code> code> 값이 할당됩니다. 🎜🎜객체 분해에 관해서는 속성 이름을 정적으로 알 필요가 없고 동적 속성 이름을 사용하여 객체를 분해할 수 있다는 사실에 조금 놀랐습니다. 🎜🎜동적 구조 분해가 어떻게 작동하는지 이해하려면 <code>greet 함수를 작성하세요. 🎜rrreee🎜2 인수를 사용하여 greet() 함수를 호출하세요. 속성 이름. 🎜🎜greet() 내부에서 구조 분해 할당 const {[nameProp]:name ='Unknown'} = obj는 대괄호 [nameProp]동적 속성 이름을 읽으면 <code>name 변수가 동적 속성 값을 받습니다. 🎜🎜더 나은 접근 방식은 속성이 존재하지 않는 경우 기본값 "Unknown"을 지정하는 것입니다. 🎜

6. 결론

객체 속성 및 배열 항목에 액세스하려는 경우 소멸이 매우 유용합니다.

기본 사용법 외에도 배열 소멸자는 편리하게 변수를 교환하고, 배열 항목에 액세스하고, 일부 불변 작업을 수행할 수 있습니다.

JavaScript는 반복자를 사용하여 사용자 지정 소멸 논리를 정의할 수 있으므로 더 큰 가능성을 제공합니다.

원본 주소: https://dmitripavlutin.com/5-interesting-uses-javascript-destructuring/

더 많은 프로그래밍 관련 지식을 보려면 프로그래밍 학습을 방문하세요! !

위 내용은 JavaScript에서 구조 분해를 사용하는 5가지 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:dmitripavlutin.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿