# Arrays
# no-array-constructor " 배열 생성: 리터럴 문법 []
- 배열 생성자의 문제점
- single-argument pitfall : 단일 인수 -> 함정 (?)
- Array global 이 재정의 될 수 있다. (?)
- 배열 생성자를 쓰는 예외
- Array 생성자가 단일 숫자 인수를 제공하여 지정된 크기의 배열 만들때.
// bad
const items = new Array(0, 1, 2);
Array(0, 1, 2);
// good
const items = [0, 1, 2];
Array(500);
new Array(someOtherArray.length);
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# 배열의 items 생성 : push
const someStack = [];
// bad
someStack[someStack.length] = 'abracadabra';
// good
someStack.push('abracadabra');
1
2
3
4
5
6
7
2
3
4
5
6
7
# 배열 복사 : ... spread operator
// bad
const len = items.length;
const itemsCopy = [];
let i;
for (i = 0; i < len; i += 1) {
itemsCopy[i] = items[i];
}
// good
const itemsCopy = [...items];
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
# iterable 객체 -> 배열 : spreads ... > Array.from.
const foo = document.querySelectorAll('.foo');
// good
const nodes = Array.from(foo);
// best
const nodes = [...foo];
1
2
3
4
5
6
7
2
3
4
5
6
7
iterable 객체 document.querySelectorAll('.foo')
의 __proto__
는 NodeList
# array-like 객체 -> 배열 : Array.from
let arrLike = { 0: 'foo', 1: 'bar', 2: 'baz', length: 3 };
/*
Object
0: "foo"
1: "bar"
2: "baz"
length: 3
__proto__: Object
*/
// bad
const arr = Array.prototype.slice.call(arrLike);
// good
const arr = Array.from(arrLike); // ["foo", "bar", "baz"]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
let arrLike = { '0': 'foo', 1: 'bar', 2: 'baz', length: 3 };
Array.from(arrLike); // ["foo", "bar", "baz"]
arrLike = { '212': 'foo', 1: 'bar', 2: 'baz', length: 3 };
Array.from(arrLike); // [undefined, "bar", "baz"]
1
2
3
4
5
2
3
4
5
length
프로퍼티가 존재.- index 번호가 0번부터 시작해서 1씩증가.
# iterable map : Array.from > spread ...
Array.from 은 중간에 배열을 생성하는 것을 방지한다.
const bar = (v) => v + 1;
const foo = [1, 2, 3];
// bad
const baz = [...foo].map(bar); // [2, 3, 4]
// good
const baz = Array.from(foo, bar) // [2, 3, 4]
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# array-callback-return : 배열 메서드의 callback 에서 return 문을 사용해야 한다
- return 을 빼뜨린 것은 아마도 실수 일 것임.
- 반환을 사용하지 않거나 반환된 결과가 필요하지 않으면 forEach 를 사용하는 것이 좋다.
// good
[1, 2, 3].map((x) => {
const y = x + 1;
return x * y;
});
// good
[1, 2, 3].map((x) => x + 1);
// bad - callback 에서 return 문을 쓰지 않으면, 첫 이터레이션 이후 `acc` 의 값은 undefined 가 된다.
[[0, 1], [2, 3], [4, 5]].reduce((acc, item, index) => {
const flatten = acc.concat(item);
});
// good
[[0, 1], [2, 3], [4, 5]].reduce((acc, item, index) => {
const flatten = acc.concat(item);
return flatten;
});
// bad
inbox.filter((msg) => {
const { subject, author } = msg;
if (subject === 'Mockingbird') {
return author === 'Harper Lee';
} else {
return false;
}
});
// good
inbox.filter((msg) => {
const { subject, author } = msg;
if (subject === 'Mockingbird') {
return author === 'Harper Lee';
}
return false;
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
Array.from
Array.prototype.every
Array.prototype.filter
Array.prototype.find
Array.prototype.findIndex
Array.prototype.flatMap
Array.prototype.forEach
(선택 사항)Array.prototype.map
Array.prototype.reduce
Array.prototype.reduceRight
Array.prototype.some
Array.prototype.sort
# 여러 줄이있는 배열의 줄바꿈: 괄호를 열때, 닫기전 사용
// bad
const arr = [
[0, 1], [2, 3], [4, 5],
];
const objectInArray = [{
id: 1,
}, {
id: 2,
}];
const numberInArray = [
1, 2,
];
// good
const arr = [[0, 1], [2, 3], [4, 5]];
const objectInArray = [
{
id: 1,
},
{
id: 2,
},
];
const numberInArray = [
1,
2,
];
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31