Search
Duplicate

[JavaScript] Array.from() 과 Array.prototype.map() 비교하기

간단소개
팔만코딩경 컨트리뷰터
ContributorNotionAccount
주제 / 분류
Javascript
Scrap
태그
javascript
9 more properties
Array.from()Array.prototype.map() 모두 기존 배열의 각 요소에 함수를 적용해서 새로운 배열을 만든다.
const arr = [0, 1, 2]; const usingFrom = Array.from(arr, (item)=> item + 1); const usingMap = arr.map((item) => item + 1); console.log(usingFrom); // [1, 2, 3]; console.log(usingMap); // [1, 2, 3];
JavaScript
복사
그렇다면 Array.from()Array.prototype.map() 의 차이는 무엇일까?

Static Method vs Instance Method

Array.from()Array.prototype.map() 차이는 우선 생김새에서부터 나타난다. Array.from() 은 Static Method 이기 때문에 instance로 생성된 배열에 대해 사용할 수 없다.
const arr = [1, 2, 3]; // 잘못된 사용 arr.from(); // Uncaught TypeError: arr.from is not a function // 올바른 사용 const newArr = Array.from(arr); console.log(newArr); // [1, 2, 3];
JavaScript
복사
Array.prototype.map() 은 Instance Method 이기 때문에 Array에 직접 사용할 수 없고, instance로 생성된 배열에 대해 사용할 수 있다.
const arr = [1, 2, 3]; // 잘못된 사용 Array.map(); // TypeError: Array.map is not a function // 올바른 사용 const newArr = arr.map((i) => i); console.log(newArr) // [1, 2, 3];
JavaScript
복사

With array-like and iterable

Array.from() 는 유사배열 객체, 이터러블 객체를 배열로 바꿔주는 기능을 가지고 있다.
const obj = {'0':'apple', '1':'banana', '2':'carrot', length: 3}; // array-like const objArr = Array.from(obj); console.log(objArr); // ["apple", "banana", "carrot"] const str = "abcde"; // iterable const strArr = Array.from(str); console.log(strArr); // ["a", "b", "c", "d", "e"];
JavaScript
복사
Array.prototype.map() 는 유사배열 객체나 이터러블 객체에 대해 사용할 수 없다.
const obj = {'0':'apple', '1':'banana', '2':'carrot', length: 3}; const objArr = obj.map(); // Uncaught TypeError: obj.map is not a function const str = "abcde"; const strArr = str.map(); // Uncaught TypeError: str.map is not a function
JavaScript
복사

Performance

Array.from()Array.prototype.map() 는 몇가지 차이가 있지만 일반 배열에 대해서는 똑같이 사용할 수 있다. 그렇다면 둘 중 무엇을 사용해야할까?

검사해보자

const fromWrapper = () => Array.from([{"count": 3},{"count": 4},{"count": 5}], x => x.count); const mapWrapper = () => [{"count": 3},{"count": 4},{"count": 5}].map(item => item.count); const iterations = 1000000; console.time('Array.from()'); for(let i = 0; i < iterations; i++){ fromWrapper(); }; console.timeEnd('Array.from()') console.time('Array.prototype.map()'); for(let i = 0; i < iterations; i++){ mapWrapper(); }; console.timeEnd('Array.prototype.map()')
JavaScript
복사

결과

# Google Chrome Version 89.0.4389.90 (Official Build) (x86_64) Array.from(): 179.098876953125 ms Array.prototype.map(): 24.609130859375 ms
Bash
복사
iterations 가 10 정도로 매우 작은 경우는 from 이 더 빠른데, iterations 이 좀만 커져도 map이 빨라지는 것을 확인할 수 있다.
고로 둘다 사용할 수 있는 상황에서는 Array.prototype.map() 를 사용하는 것이 좋다

참고