이 상황에서 .map ()은 무엇을합니까?


95

Chrome 콘솔을 사용하면 이것이 내 입력 및 출력입니다.

[0].map(Array);

[[0, 0, [0]]]; // output

여기서 무슨 일이 일어나고 있습니까?

편집하다

이것이 나를 궁금하게 만드는 이유는

[0].map(String);

돌아올 것이다

["0"];

그리고

["0", "0", "String"]

34
나는 그가 행복하게 느끼기 위해 항상 자바 스크립트 WTF가 필요하기 때문에 생각한다
npst

12
오, 그것은 단지 덜 wtf-y 변형입니다['10', '10', '10'].map(parseInt)
gronostaj

2
또 다른 이상한 .map()동작 : stackoverflow.com/questions/14528397/… 일반적으로 .map()둘 이상의 인수를 사용 하는 함수와 함께 사용할 때는주의해야합니다 .
Barmar

2
그냥하세요[0].map(console.log)
Bergi

1
@Jacksonkr : 답변 주셔서 감사합니다. 나는 그것이 다음과 같았다고 생각한다 : 나는 JS WTF를 보는 것이 나를 행복하게 만든다는 것을 설명하면서 내가 자주 언어를 사용할 필요가 없다는 것을 설명했다. 누군가 내가 언어가 마음에 들지 않으면 JS 질문을 보는 이유를 물었습니다. npst가 응답했고 처음 두 개의 댓글이 삭제되었습니다. 그의 댓글이 여전히 찬성되는 것은 재밌습니다.
에릭 Duminil

답변:


123

.map()함수가 호출되는 Array()세 개의 인자이며 배열 요소의 값에 함수 0도, 그 요소의 인덱스 0, 전체 어레이에 대한 참조.

따라서 다음과 같습니다.

var a = [0];
var index = 0
Array(a[index], index, a);   // create array with three elements

그러면 반환 된 Array()배열이 .map()생성 되는 배열의 첫 번째 요소가 되므로 [[0, 0, [0]]]결과 에 추가 중첩 수준이 적용 됩니다.

당신의 편집에 대한 편집 : 당신이 말할 때 [0].map(String);의 그 결과 String()같은 같은 세 개의 인수로 호출되고는 String(a[index], index, a)있지만, String()반면에 기능을 제외한 모든 첫 번째 인수를 무시 Array()가 사용하는 모든 인수를 공급했다.


39

첫째 , Array배열을 만드는 함수로 사용할 수 있습니다.

var arr = Array(1, 2, "Hello");

console.log(arr); // [1, 2, "Hello"]

둘째 , map콜백에 세 개의 매개 변수를 전달합니다. 요소, 배열의 색인 및 배열 자체입니다.

따라서 배열에 하나의 요소가 포함되어 있으므로 다음 줄은 다음과 같습니다.

[0].map(Array);

다음과 같습니다.

[Array(0, 0, [0])];     // the element 0 in the original array will be mapped into Array(0, 0, [0])

6

질문을 업데이트 한 후. 다른 답변은 지도 에 대한 정보를 제공합니다.

배열과 문자열이 다른 이유에 답하려면 생성자를 찾습니다.

문자열 생성자는 1 개의 매개 변수 String (thing) 을 받아들이고 배열 new Array (element0, element1 [, ... [, elementN]])


2
.map(Number)모든 항목에 대해 같은 것을 반환하는 대신 모든 항목을 숫자로 변환 하는 것과 같은 이유 [3, 2, [4, 1, 3]]입니다.
user4642212

@Xufox 예 대답은 생성자에 있습니다 :)
Volodymyr Bilyachat

4

이 전화

[0].map(Array);

다음과 같이 작성한 것과 동일한 결과를 제공합니다.

[0].map(function (value, index, array) {
    return Array(value, index, array);
})

Map 함수는 요소 값, 요소 인덱스 및 전체 배열의 세 가지 매개 변수로 Array 함수를 호출 합니다. 이 호출은 Array값 (number 0), 인덱스 (number 0), 전체 배열 ( [0])의 3 개 요소가있는 배열 을 반환합니다 .

그리고이 새 배열은 원래 요소 (number 0)를 새 요소 (3 개 요소의 배열)에 매핑했기 때문에 원래 Array에 래핑됩니다.

참고 : 다음과 같이 첫 번째 매개 변수 만 사용하는 데 익숙 할 수 있습니다.

array.map(function (a) { return a * a; });

또는 색인을 얻기 위해 두 개만 사용하면

array.map(function (item, index) { return "index=" + index + ", value=" + item; });

그러나 map콜백 함수에서 무시하면되는 3 개의 매개 변수 가 여전히 제공 된다는 점을 기억해야 합니다. 이것이 코드가 다음과 같은 이유이기도합니다.

[0].map(String);

보고

["0"]

String 함수는 첫 번째 매개 변수에만 관심이 있고 전달 된 다른 매개 변수는 무시 하기 때문 입니다. 전화하면

String(11, "Some", "other", "ignored", "parameters")

당신은 여전히 ​​얻을 것이다

"11"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.