typeof
, Array.isArray
에 대해 조사해보고 constructor로 타입을 검사할때의 한계를 조사해보자!map()
으로 컴포넌트 뿌려줄때 index
를 기본키로 사용하는 이유피연산자의 평가 전 자료형을 문자열로 반환해준다.
참고로 배열===객체기에 배열도 객체로 변환된다.
반환표는 아래와 같다.
Undefined : "undefined"
Null : "object" (아래 참고)
Boolean : "boolean"
Number : "number"
BigInt : "bigint"
String : "string"
Symbol (ECMAScript 2015에서 추가) : "symbol"
호스트 객체 (JS 환경에서 제공) 구현체마다 다름
Function 객체 (ECMA-262 표현으로는 [[Call]]을 구현하는 객체) : "function"
다른 모든 객체 : "object"
JS가 값과 태그로 구분하던 시절 객체의 태그는 "0"이었다.
대부분의 프로그래밍 언어에서는 return 0 === return null (null pointer)
따라서 null이 object로 리턴되게 됨.
=> 대부분의 원시값은 잘 판단하지만 null, array는 판단하지 못함
It does not check the value's prototype chain,
프로토타입 체인을 따라가지 않는다. 현재의 값만 배열인지 판단한다.
배열인지 아닌지 절대적으로 판단해준다. 무적임!
=> 다만 배열 외의 값 판단은 못한다.
이 값의 생성자가 무엇인지 찾아보는것이다.
값.constructor
이렇게 사용한다.
과제에서 깊은복사 유틸함수를 제작했을때 객체,배열 판단을 constructor
로 했다.
이 부분을 멘토님이 짚어주셨다. 이걸로 검사할때의 한계를 알아보자.
constructor
는 프로토타입 체인을 따라가서 판단한다.
다시말해, 생성자함수를 뱉는다.
리터럴이나 빌트인 생성자로 정의한 값이라면 문제 없지만...
사용자가 만든 생성자함수로 정의한 값(인스턴스)라면 얘기가 달라진다...
내가 원하는값은 모든 객체의 프로토타입인 Obejct였다.
그러나 생성자함수가 반환된다.
잘 알고쓰는게 중요하다...검색해서 나왔다고 막 쓰지말자.
강사님의 코드를 보고 따라치는건 좋지 않은것 같다.
주말에 혼자 만들어봐야지...