본문 바로가기

언어/Javascript

[짧] apply에 관해..

 

문제를 풀고 다른 사람이 작성한 답을 보다가 헷갈리는 부분이 있어 포스팅합니다.

 

TIP )

[...Array(5).keys()]; // range(5)

 

let tube1 = Array.apply(null, Array(t));
let tube2 = Array(t).fill(undefined);
let tube3 = Array(t)
console.log(tube1) // [undefined x t]
console.log(tube3 // [undefined x t]
console.log(tube3) // [empty x t]

tube1과 tube2는 동일하게 undefined로 채워집니다.

https://school.programmers.co.kr/learn/courses/30/lessons/17687

해당 문제에서 꼭 위와 같이 쓴 이유는 empty로 하면 map으로 순회를 하지 않기 때문에

굳이 undefined로 채우는 문법을 사용한 것으로 보입니다.

 

그래서 tube1과 tube2는 같겠지 해서 아래와 같이 비교해보았는데

tube1 === tube2 // false

 

무언가 다른게 있구나 싶어 constructor를 전부 뒤져보았는데 다른 점이 보이지 않았습니다.

그래서 아 설마.. 하고

 

[1,2,3] === [1,2,3] // false

이 역시 false가 나왔습니다.

여기서 참조를 동일하게 하니

b = a
a === b //true

true가 도출되었습니다.

이는 원시 타입이 아닌 참조 타입일 시, 참조가 동일해야 동등 연산자가 들어 먹는다고 알 수 있었습니다.

(추후 좀 더 상세히 수정 요망.)

 

 

apply => apply() 메서드는 주어진 this 값과 배열 (또는 유사 배열 객체) 로 제공되는 arguments 로 함수를 호출합니다. 

(출처 MDN)

 

그렇기에 위의

Array.apply(null, Array(t));

의 경우 Array선언 안에 Array(t) arguments들을 넣어주고 apply특성상 빈 값이 안들어가고 null 또는 undefined가 들어가므로 undefined로 채워 진 것이라고 보여집니다.

 

 

+ 함수 선언식 함수 표현식

함수 선언식으로 작성한 함수는, 함수 전체가 호이스팅 된다고 하였는데, 전역적으로 선언하게 되면, 중복적으로 동명의 함수를 쓰게 된다면, 원치 않는 결과를 초래할 수 있습니다.

함수 표현식으로 작성하게되면 이를 방지할 수 있습니다. => 함수 표현식 권장