ECMAScript6 학습 노트(3): 배열의 확장
40737 단어 ECMAScript
확장 연산자
...
는 ES6에 새로 추가된 확장 연산자입니다.이것은 하나의 그룹을 쉼표로 구분된 매개 변수 서열로 변환할 수 있다.console.log(...[1, 2, 3]);
// console.log(1, 2, 3);
이 특성을 이용하여 우리는 실현된
Iterator
의 대상을 수조로 쉽게 바꿀 수 있다.[...document.getElementsByTagName('div')]
// [div, div, div, ...]
확장 연산자는 함수를 대체하는
apply
방법에도 사용할 수 있습니다.// ECMAScript5
function fn(x, y, z) {
console.log(x + y + z); // 6
}
fn.apply(null, [1, 2, 3]);
// ECMAScript6
function fn(x, y, z) {
console.log(x + y + z); // 6
}
fn(...[1, 2, 3]);
// ...
Math.max(...[1, 2, 3]); // 3
Math.max([1, 2, 3]); // NaN
Math.max.apply(null, [1, 2, 3]); // 3
기타 실제 운용:
1. 간단한 배열 복제
//
const array1 = [1, 2, 3];
// ( )
const [...array2] = array1;
// ( )
const array2 = [...array1];
...
연산자를 통해 수조를 복사하는 방법은 얕은 복사이기 때문에 깊은 수조를 직접 복사하는 데 사용할 수 없다.2. 배열 결합
const array1 = [1, 'a'];
const array2 = [2, 'b'];
const array3 = [3, { c: 'c' }]; //
const array4 = [...array1, ...array2, ...array3];
arra4[5]['c'] === arra3[1]['c']; // true
3. 문자열을 배열로 변환
[...'hello']
// [h, e, l, l, o]
이 방법을 사용하면 4바이트의 유니코드 문자를 정확하게 식별하여 문자 통계에 사용할 수 있습니다.
'x\uD83D\uDE80y'.length // 4
//
;[...'x\uD83D\uDE80y'].length // 3
function length(str) {
return [...str].length;
}
length('x\uD83D\uDE80y') // 3
4. Iterator 인터페이스를 임의로 구현한 객체를 배열로 변환
코드를 쓰는 과정에서 우리는 클래스 그룹이 사용할 수 없는
forEach
방법의 문제에 자주 부딪힌다. 예를 들어 NodeList, HTMLCollection 등이다.이전에 우리는 유형 변환을 해서 다음과 같은 용도를 사용했을 것이다.// ECMAScript5
[].slice.call(HTMLCollection, null);
혹은
// ECMAScript6
Array.from(HTMLCollection);
이제 또 하나의 방법이 생겼다.
[...document.getElementsByTagName('div')]
위의
NodeList
나HTMLCollection
가 확장 연산자를 사용하여 이를 진정한 수조로 바꿀 수 있는 이유는 모두 실현되었기 때문이다Iterator
.Number.prototype[Symbol.iterator] = function*() {
let i = 0;
let num = this.valueOf();
while (i < num) {
yield i++;
}
}
console.log([...5]) // [0, 1, 2, 3, 4]
Array.from()
Array.from()
역시 ECMAScript6에서 유래한 것으로 확장 연산자의 용도와 비슷하지만 크게 다르다.Array.from()와...의 차이
Array.from: 이 방법은 모든 클래스의 대상을 지원합니다. 이른바 클래스의 대상은
length
속성을 가진 모든 대상입니다.따라서 length
속성이 있는 대상만 Array.from
방법으로 수조로 전환할 수 있다.Array.from({ length: 3 });
// [ undefined, undefined, undefined ]
Array.from
방법은 두 번째 매개 변수를 받아들일 수 있으며 수조와 유사한 map
방법으로 모든 원소를 처리하고 처리된 값을 되돌아오는 수조에 넣는다.Array.from([1, 2, 3], (x) => x * x);
// [1, 4, 9]
Array.from([1, 2, 3]).map(x => x * x);
// [1, 4, 9]
확장 연산자 (...): 확장 연산자 뒤에 호출된 것은 플러그인 인터페이스 (Symbol.iterator) 입니다. 대상이 이 인터페이스를 배치하지 않으면 전환할 수 없습니다.
Array.of()
Array.of
방법은 한 조의 값을 수조로 바꾸는 데 사용되며 확장 연산자의 역연산이다.그것의 출현은 수조 구조 함수Array()
의 부족함을 보완했다.//
Array() // []
Array(3) // [, , ,]
Array(3, 11, 8) // [3, 11, 8]
// Array.of
Array.of(3, 11, 8) // [3,11,8]
Array.of(3) // [3]
Array.of(3).length // 1
Array.of(undefined) // [undefined]
ES5에서는 다음 방법으로 시뮬레이션
Array.of
방법을 사용할 수 있습니다.function ArrayOf() {
return [].slice.call(arguments);
}
find() 및 findIndex()
수조 실례
find
방법은 첫 번째 조건에 부합되는 수조 구성원을 찾아내는 데 쓰인다.그것의 매개 변수는 하나의 리셋 함수이다. 이 리셋 함수는 세 개의 매개 변수를 받아들일 수 있으며, 순서대로 현재 값, 현재 인덱스, 원본 그룹을 대표한다.[0, 1, -2, 3].find((item, index, array) => item < 0);
// -2
findIndex
방법은 find
방법과 비슷하다.다른 점findIndex
은 첫 번째 조건에 부합되는 그룹 구성원의 하표를 되돌려주고find
방법은 첫 번째 조건에 부합되는 그룹 구성원 자체를 되돌려준다.두 번째 매개변수를 수신하여 콜백 함수
this
의 방향을 지정할 수 있습니다.[1, 2, 3, 4].find(item => {
console.log(this); // Window
return item === 1;
}, window);
// 1
fill()
fill
방법은 주어진 값으로 수조를 채운다.[].fill(2); // []
[ , , ].fill(2); // [2, 2]
[1, 1, 1].fill(2); // [2, 2, 2]
new Array(3).fill(2); // [2, 2, 2]
fill
메서드의 두 번째 및 세 번째 매개변수는 시작 및 끝 위치를 채우는 것을 나타냅니다.['a', 'b', 'c'].fill(66, 1, 2);
// ['a', 66, 'c']
entries()、keys()、values()
ES6는 세 가지 새로운 방법인 entries (), 키 (),values () 를 제공합니다. 그룹을 옮겨다니는 데 사용됩니다.그것들은 모두 하나의 플러그인 대상을 되돌려줍니다. for... of 순환으로 플러그인을 할 수 있습니다. 유일한 차이점은 키스 () 는 키 이름에 대한 플러그인이고,values () 는 키 값에 대한 플러그인이며,entries () 는 키 값에 대한 플러그인입니다.
for (let index of ['a', 'b'].keys()) {
console.log(index);
}
// 0
// 1
for (let elem of ['a', 'b'].values()) {
console.log(elem);
}
// 'a'
// 'b'
for (let [index, elem] of ['a', 'b'].entries()) {
console.log(index, elem);
}
// 0 "a"
// 1 "b"
// for..of..
let letter = ['a', 'b', 'c'];
let entries = letter.entries();
console.log(entries.next().value); // [0, 'a']
console.log(entries.next().value); // [1, 'b']
console.log(entries.next().value); // [2, 'c']
includes()
Array.prototype.includes
방법은 하나의 그룹이 주어진 값을 포함하는지 검사하는 데 사용되며, 되돌아오는 것은 Boolean
유형이다.[1, 2, 3].includes(2) // true
[1, 2, 3].includes(4) // false
[1, 2, NaN].includes(NaN) // true
'hello'.includes('he') // true
이 방법의 두 번째 매개 변수는 검색의 시작 위치를 표시합니다. 기본값은 0입니다.두 번째 매개변수가 음수이면 역수의 위치를 나타내며 두 번째 매개변수가 -4이지만 배열 길이가 3)보다 크면 0부터 재설정됩니다.
[1, 2, 3].includes(3, 3); // false
[1, 2, 3].includes(3, -1); // true
includes
방법이 없기 전에 우리는 보통 indexOf
방법을 사용하여 수조에 주어진 값이 포함되어 있는지 없는지를 보조적으로 판단한다.그러나 indexOf
는 어의화가 부족하고 indexOf
방법으로 NaN
의 구성원을 판단할 수 없다.[1, NaN, 3].indexOf(1) !== -1; // true
[1, NaN, 3].indexOf(NaN) !== -1; // false
flat() 및 flatMap
수조 실례
flat
방법은 수조를 겹겹이 펼칠 수 있다. 이것은 매개 변수를 받아들여 몇 층을 펼칠 것인지, 값이 0일 때 펼치지 않을 것인지를 나타낸다.[1, [2, 3, [4], 5], 6].flat(); // [1, 2, 3, [4], 5, 6]
[1, [2, 3, [4], 5], 6].flat(0); // [1, [2, 3, [4], 5], 6]
[1, [2, 3, [4], 5], 6].flat(1); // [1, 2, 3, [4], 5, 6]
[1, [2, 3, [4], 5], 6].flat(2); // [1, 2, 3, 4, 5, 6]
flatMap
방법은 map
방법과 flat
방법의 조합에 해당한다// [[2, 4], [3, 6], [4, 8]].flat()
[2, 3, 4].flatMap((x) => [x, x * 2])
// [2, 4, 3, 6, 4, 8]
배열의 빈자리
new Array(3); // [,,,]
[1, 1, 1, 1]
와[ , , , ]
모두 세 가지가 있지만'전자의 길이는 4, 후자의 길이는 3이니 당연하게 추측하지 마세요.빈자리는 아무것도 없다는 것을 의미하며
undefined
와 같지 않다.0 in [undefined]; // true
0 in [,]; // false
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Vue.js의 v-for로 분할 할당의 v-for 지시어로 과 같은 것을 하고 싶었습니다만, 「Vue.js 분할 대입」이나 「v-for 분할 대입」과 같이 검색해도 히트하지 않고 , 영어에서 "Vue.js Destructuring assignment"...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.