TIL 2020.03.24

kimfriendship·2020년 9월 26일
0

TIL

목록 보기
17/207
post-thumbnail

Today I Learned...

  1. JavaScript PoiemaWeb 예습

    ✅ 30 스프레드 문법 읽기
    ✅ 31 디스트럭처링 할당 읽기

  2. JavaScript PoiemaWeb 복습

    ❌ 27 배열 예제 직접 풀어보기
    ❌ 배열 메소드로 스택 만들기
    ❌ 배열 메소드로 큐 만들기

  3. Github Blog 정리

    ✅ 30 스프레드 문법 요약
    ✅ 31 디스트럭처링 할당 요약



Tomorrow I will Learn...

👊 JavaScript 배열 수업

👊 JavaScript 스프레드 문법 수업

👊 JavaScript 디스트럭처링 할당 수업



QnA

🤷‍♀️ ES5에서 기존의 배열에 다른 배열의 요소들을 push할 때, 다음의 코드는 왜 문제가 생길까?

let arr1 = [1, 2];
let arr2 = [3, 4];
let arr3 = [5, 6];

Array.prototype.push.apply(arr1, arr2);
console.log(arr1); // [1,2,3,4]

[].push.apply(arr1, arr2);
console.log(arr1); // [1,2,3,4]

arr1.push.apply(null, arr3);
console.log(arr1); // ???

헷갈렸던 이유는 Math.max.apply(null, arr1);와 같은 코드 때문이다. Math.max는 정적 메소드이기 때문에 this를 필요로 하지 않는다. 단지 Math.max가 인수로 받을 arr1이라는 값이 배열이었기 때문에, 두번 째 인수를 배열로 받아 풀어줄 수 있는 (스프레드 문법을 대신해줄 수 있는) apply를 활용한 것이었다. 그런데 push의 경우, 프로토타입 메소드이기 때문에 this 바인딩이 꼭 필요하다. 그래서 apply의 첫 번째 인수로 null을 주게 되면 null 값에 arr3를 push 할수가 없기 때문에 에러(TypeError: Cannot convert undefined or null to object at push)가 발생하게 되는 것이다. 같은 프로토타입 메소드인 splice 쓸 때도 마찬가지!!



Comments

  • 확실히 직접 코드를 쳐보니까 메소드를 어떻게 써야하는지 감이 온다. 아직도 mutator인지 accessor인지 헷갈리고, 메소드마다 어떤 리턴값을 갖는지 깜빡깜빡하지만 계속 익숙해지면 나아질 것 같다!


profile
👼🏻 Front-end Developer

0개의 댓글