소멸은(아마도 중첩 된)객체와 배열에 저장된 데이터에서 여러 값을 추출하는 편리한 방법입니다. 데이터를 수신하는 위치(예:할당의 왼쪽)에서 사용할 수 있습니다. 값을 추출하는 방법은 패턴을 통해 지정됩니다(예제는 읽어보기).
10.1.1 객체 소멸#
객체 소멸:
constobj={first:'Jane',last:'Doe'};const{first:f,last:l}=obj;// f = 'Jane'; l = 'Doe'// {prop} is short for {prop: prop}const{first,last}=obj;// first = 'Jane'; last = 'Doe'
constarr=;for(constofarr.entries()){console.log(index,element);}// Output:// 0 a// 1 b
10.2 배경:데이터 생성 대 데이터 추출#
파괴가 무엇인지 완전히 이해하려면 먼저 더 넓은 컨텍스트를 살펴 보겠습니다.
자바스크립트는 한 번에 하나의 속성인 데이터를 생성하는 작업을 수행합니다:
constobj={};obj.first='Jane';obj.last='Doe';
동일한 구문을 사용하여 데이터를 추출 할 수 있습니다. 다시 한 번에 하나의 속성:
constf=obj.first;constl=obj.last;
또한 개체 리터럴을 통해 여러 속성을 동시에 생성하는 구문이 있습니다:
constobj={first:'Jane',last:'Doe'};
이전에는 데이터를 추출하는 해당 메커니즘이 없었습니다. 즉,소멸 무엇-그것은 당신이 객체 패턴을 통해 객체에서 여러 속성을 추출 할 수 있습니다. 예를 들어,할당의 왼쪽에 있습니다:
const{first:f,last:l}=obj;
패턴을 통해 배열을 파괴 할 수도 있습니다:
const=;// x = 'a'; y = 'b'
10.3 파괴 패턴#
다음 두 당사자가 파괴에 관여합니다:
소멸 소스:파괴 할 데이터. 예를 들어,소멸 할당의 오른쪽입니다.
소멸 대상:소멸에 사용되는 패턴. 예를 들어,소멸 할당의 왼쪽입니다.
소멸 대상은 세 가지 패턴 중 하나입니다:
할당 대상. 예를 들어: x
할당 대상은 일반적으로 변수입니다. 그러나 구조화 할당에서는 나중에 설명 할 것이므로 더 많은 옵션이 있습니다.
개체 패턴. 예를 들어: { first: "pattern", last: "pattern" }
객체 패턴의 부분은 속성이며,속성 값은 다시 패턴(재귀 적으로)입니다.
배열 패턴. 예를 들어:
배열 패턴의 부분은 요소이며 요소는 다시 패턴입니다(재귀 적으로).
즉,패턴을 임의로 깊게 중첩 할 수 있습니다:
constobj={a:,b:true};const{a:}=obj;// f = 123
10.3.1 필요한 것을 선택하십시오#
객체를 파괴하면 관심있는 속성 만 언급합니다.:
const{x:x}={x:7,y:3};// x = 7
배열을 파괴하는 경우 접두사만 추출하도록 선택할 수 있습니다:
const=;// x='a'; y='b';
10.4 패턴은 값의 내장에 어떻게 접근합니까? #
할당pattern = someValue에서pattern은someValue내부의 내용에 어떻게 액세스합니까?
10.4.1 객체 패턴은 객체에 값을 강제 적용#
객체 패턴은 속성에 액세스하기 전에 소멸 소스를 객체에 강제 적용합니다. 즉,원시 값과 함께 작동한다는 것을 의미합니다:
const{length:len}='abc';// len = 3const{toString:s}=123;// s = Number.prototype.toString
10.4.1.1 개체 파괴에 실패 값#
개체에 대한 강제 변환은Object()를 통해 수행되지 않고 내부 작업ToObject()을 통해 수행됩니다. 두 작업은undefined와null을 다르게 처리합니다.
Object()기본 값을 래퍼 객체로 변환하고 객체를 그대로 둡니다.:
> typeof Object('abc')'object'> var obj = {};> Object(obj) === objtrue
It also converts undefined and null to empty objects:
> Object(undefined){}> Object(null){}
In contrast, ToObject() throws a TypeError if it encounters undefined or null. Therefore, the following destructurings fail, even before destructuring accesses any properties:
따라서 빈 개체 패턴{}을 사용하여 값을 개체에 강제 적용할 수 있는지 확인할 수 있습니다. 우리가 보았 듯이undefined와null만:
({}=);// OK, Arrays are coercible to objects({}='abc');// OK, strings are coercible to objects({}=undefined);// TypeError({}=null);// TypeError
명령문은 자바스크립트에서 중괄호로 시작해서는 안 되기 때문에 표현식 주위의 괄호가 필요합니다(자세한 내용은 나중에 설명합니다).
10.4.2 배열 패턴 반복 가능 작업#
배열 소멸은 반복기를 사용하여 소스의 요소를 가져옵니다. 따라서 반복 가능한 모든 값을 배열 파괴 할 수 있습니다. 반복 가능한 값의 예를 살펴 보겠습니다.
문자열 반복 가능:
const='abc';// x='a'; y=
문자열 반복자는 코드 단위(“자바 스크립트 문자”,16 비트)가 아닌 코드 포인트(“유니 코드 문자”,21 비트)를 반환한다는 것을 잊지 마십시오. 유니코드에 대한 자세한 내용은”24 장”장을 참조하십시오. 유니 코드 및 자바 스크립트”에서”말하기 자바 스크립트”.)예를 들어:
인덱스를 통해 세트의 요소에 액세스 할 수는 없지만 반복자를 통해 그렇게 할 수 있습니다. 따라서 배열 소멸은 집합에 대해 작동합니다:
const=newSet();// x='a'; y='b';
Set반복기는 항상 삽입된 순서대로 요소를 반환하므로 이전 소멸 결과는 항상 동일합니다.
10.4.2.1 배열 파괴 실패 값#
값이 개체를 반환하는 키가Symbol.iterator인 메서드가 있으면 반복 가능합니다. 배열 소멸은 파괴 될 값이 반복 가능하지 않은 경우TypeError를 발생시킵니다:
letx;=;// OK, Arrays are iterable='abc';// OK, strings are iterable={*(){yield1}};// OK, iterable={};// TypeError, empty objects are not iterable=undefined;// TypeError, not iterable=null;// TypeError, not iterable
즉,빈 배열 패턴을 사용하여 값이 반복 가능한지 여부를 확인할 수 있습니다:
={};// TypeError, empty objects are not iterable=undefined;// TypeError, not iterable=null;// TypeError, not iterable
10.5 기본값#
기본값은 패턴의 선택적 기능입니다. 원본에 아무 것도 발견되지 않으면 대체를 제공합니다. 파트(개체 속성 또는 배열 요소)가 소스에서 일치하지 않는 경우 다음과 같이 일치합니다:
기본값(지정된 경우; 그것은 선택적입니다)
undefined (그렇지 않으면)
의 예를 살펴 보자. 다음 소멸에서 인덱스 0 의 요소는 오른쪽에 일치하지 않습니다. 따라서 소멸은x와 3 을 일치시켜 계속되며,이는x가 3 으로 설정되도록합니다.
const=;// x = 3; y = undefined
개체 패턴에서 기본값을 사용할 수도 있습니다:
const{foo:x=3,bar:y}={};// x = 3; y = undefined
10.5.1 undefined 트리거 기본값#
파트에 일치 항목이 있고 해당 일치 항목이undefined인 경우에도 기본값이 사용됩니다.:
const=;// x = 1const{prop:y=2}={prop:undefined};// y = 2
그러나 주문이 중요합니다: 변수x및y은 왼쪽에서 오른쪽으로 선언되며 선언 앞에 액세스하면ReferenceError가 생성됩니다:
const=;// ReferenceError
10.5.4 패턴의 기본값#
지금까지 변수의 기본값만 보았지만 패턴과 연결할 수도 있습니다:
const=;
이것은 무엇을 의미 하는가? 기본값에 대한 규칙 리콜:파트가 원본에서 일치하지 않는 경우 소멸은 기본값으로 계속됩니다.
인덱스 0 의 요소가 일치하지 않기 때문에 소멸이 계속됩니다:
const{prop:x}={};// x = undefined
패턴{ prop: x }을 변수로 바꾸면 왜 이런 식으로 작동하는지 더 쉽게 알 수 있습니다pattern:
const=;
10.5.5 더 복잡한 기본값#
패턴의 기본값을 자세히 살펴 보겠습니다. 다음 예제에서는 기본값{ prop: 123 }을 통해x에 값을 할당합니다:
const=;
인덱스 0 의 배열 요소가 오른쪽에 일치하지 않기 때문에 소멸은 다음과 같이 계속되고x는 123 으로 설정됩니다.
const{prop:x}={prop:123};// x = 123
그러나x는 기본값이 트리거되지 않기 때문에 오른쪽에 인덱스 0 에 요소가 있는 경우 이러한 방식으로 값이 할당되지 않습니다.
const=;
이 경우 소멸은 다음과 같이 계속됩니다:
const{prop:x}={};// x = undefined
따라서 개체 또는 속성이 없는 경우x가 123 이 되도록 하려면x자체에 대한 기본값을 지정해야 합니다:
const=;
여기서,소멸은 우변이인지인지 독립적으로 다음과 같이 계속된다.
const{prop:x=123}={};// x = 123
10.6 더 많은 객체 소멸 기능#
10.6.1 속성 값 속기#
속성 값 속기는 객체 리터럴의 특징입니다: 속성 값이 속성 키와 이름이 같은 변수인 경우 키를 생략할 수 있습니다. 이 파괴에 대 한 작동,너무:
const{x,y}={x:11,y:8};// x = 11; y = 8// Same as:const{x:x,y:y}={x:11,y:8};
속성 값 약식을 기본값과 결합할 수도 있습니다:
const{x,y=1}={};// x = undefined; y = 1
10.6.2 계산된 속성 키#
계산된 속성 키는 소멸에 사용할 수 있는 또 다른 개체 리터럴 기능입니다. 속성 키를 대괄호 안에 넣으면 식을 통해 지정할 수 있습니다:
constFOO='foo';const{:f}={foo:123};// f = 123
계산 된 속성 키를 사용하면 키가 기호 인 속성을 파괴 할 수 있습니다:
// Create and destructure a property whose key is a symbolconstKEY=Symbol();constobj={:'abc'};const{:x}=obj;// x = 'abc'// Extract Array.prototypeconst{:func}=;console.log(typeoffunc);// function
10.7 더 많은 배열 소멸 기능#
10.7.1 제거#
제거 하면 배열”구멍”의 구문을 사용 하 여 소멸 하는 동안 요소를 건너뛸 수 있습니다:
const=;// x = 'c'; y = 'd'
10.7.2 나머지 연산자(...) #
나머지 연산자를 사용하면 반복 가능 요소의 나머지 요소를 배열로 추출 할 수 있습니다. 이 연산자가 배열 패턴 내에서 사용되는 경우 마지막에 와야합니다:
const=;// x='a'; y=
연산자가 요소를 찾을 수 없으면 해당 피연산자가 빈 배열과 일치합니다. 즉,undefined또는null을 생성하지 않습니다. 예를 들어:
const=;// x='a'; y=undefined; z=
나머지 연산자의 피연산자는 변수일 필요는 없으며 패턴도 사용할 수 있습니다:
const]=;// x = 'a'; y = 'b'; z = 'c'
나머지 연산자는 다음과 같은 소멸을 트리거합니다:
=
10.8 변수 이상의 변수에 할당할 수 있습니다#
소멸을 통해 할당하는 경우 각 할당 대상은 일반 할당의 왼쪽에 허용되는 모든 것일 수 있습니다.
소멸 함수 또는 메서드에 의해 반환 되는 개체에서 데이터를 추출 하는 데 유용 합니다. 예를 들어 반복자 메서드next()은done와value의 두 속성을 가진 개체를 반환합니다. 다음 코드는 반복자iter을 통해 배열arr의 모든 요소를 기록합니다. 파괴는 라인에 사용.
const=newSet().add('a').add('b');// x = 'a'; y = 'b'const='foo';// a = 'f'; b = 'o'
10.10.4 다중 리턴 값#
다중 리턴 값의 유용성을 확인하려면p이true를 반환하는a배열의 첫 번째 요소를 검색하는findElement(a, p)함수를 구현해 보겠습니다. 질문:findElement()는 무엇을 반환해야합니까? 때로는 요소 자체,때로는 인덱스,때로는 둘 다에 관심이 있습니다. 다음 구현은 둘 다 반환합니다.
functionfindElement(array,predicate){for(constofarray.entries()){// (A)if(predicate(element,index,array)){// We found an element:return{element,index};// Same as (property value shorthands):// { element: element, index: index }}}// We couldn't find anything; return failure values:return{element:undefined,index:-1};}
이 함수는 배열 메서드entries()을 통해array의 모든 요소를 반복합니다. 쌍의 부분은 파괴를 통해 액세스 할 수 있습니다.
사용하자findElement():
constarr=;const{element,index}=findElement(arr,x=>x%2===0);// element = 8, index = 1
콜백은 화살표 함수이며,반환 값은 속성 값 속기와 객체 패턴을 통해 파괴된다.
index및element으로 인해 속성 키를 언급하는 순서는 중요하지 않습니다. 우리는 그들을 바꿀 수 있고 아무것도 변하지 않습니다:
const{index,element}=findElement(···);
우리는 인덱스와 요소를 모두 필요로하는 경우를 성공적으로 처리했습니다. 우리가 그들 중 하나에만 관심이 있다면 어떨까요? 그 결과,우리의 구현도 그 문제를 해결할 수 있습니다. 그리고 단일 반환 값을 가진 함수에 비해 구문 오버 헤드가 최소화됩니다.
consta=;const{element}=findElement(a,x=>x%2===0);// element = 8const{index}=findElement(a,x=>x%2===0);// index = 1
pattern을 사용하여value에서 데이터를 추출하려고합니다. 이제 함수형 프로그래밍에서 패턴 일치(짧은:일치)로 알려진 알고리즘을 설명하겠습니다. 알고리즘은pattern과value과 일치하고 변수에 할당하는 소멸 할당에 대한 연산자←(“일치”)를 지정합니다:
"pattern"←"value"
알고리즘은←연산자의 두 피연산자를 구분하는 재귀 규칙을 통해 지정됩니다. 선언적 표기법은 익숙해지는 데 다소 걸릴 수 있지만 알고리즘의 사양을 더 간결하게 만듭니다. 각 규칙에는 두 부분이 있습니다:
머리(첫 번째 줄)는 규칙을 트리거하는 조건을 설명합니다.
본문(나머지 줄)은 규칙이 트리거되면 어떻게 되는지 설명합니다.
예를 살펴 보겠습니다.:
(2) {key: "pattern", "properties"} ← obj
"pattern"←obj.key{"properties"}←obj
(2 이자형){} ← obj(왼쪽 속성 없음)
// Nothing to do
에 규칙(2 기음),헤드는 하나 이상의 속성과 0 개 이상의 나머지 속성을 가진 객체 패턴이있는 경우이 규칙이 실행됨을 의미합니다. 이 패턴은obj값과 일치합니다. 이 규칙의 효과는 속성 값 패턴이obj.key에 대해 일치되고 나머지 속성이obj에 대해 일치되는 상태에서 실행이 계속된다는 것입니다.헤드는 빈 객체 패턴{}이obj값과 일치하는 경우 이 규칙이 실행됨을 의미합니다. 그런 다음 할 일이 없습니다.
알고리즘이 호출될 때마다 규칙은 위에서 아래로 체크되고 적용되는 첫 번째 규칙만 실행됩니다.
소멸 할당 알고리즘 만 표시합니다. 변수 선언 소멸과 매개 변수 정의 소멸도 비슷하게 작동합니다.
고급 기능(계산 된 속성 키,속성 값 속기)은 다루지 않습니다; 객체 속성 및 배열 요소를 할당 대상으로 함). 만 기본.
10.11.1.1 패턴#
패턴은 다음 중 하나입니다:
변수: x
개체 패턴: {"properties"}
배열 패턴:
다음 각 절에서는 이 세 가지 사례 중 하나를 설명합니다.
다음 세 섹션에서는 이러한 세 가지 경우를 처리하는 방법을 지정합니다. 각 섹션에는 하나 이상의 번호가 매겨진 규칙이 포함되어 있습니다.