본문 바로가기

개발/javascript

[Javascript] 당신의 머리를 터지게 만들 Instanceof

안심하세요 머리는 안터집니다.
바야흐로 어그로의 시대 아니겠습니까 ㅎ

 

 

지난 포스팅에서 언급했듯이,

instanceof 는 >, <, == 와 같이 앞뒤에 인자를 받아 true / false를 반환해주는 비교연산자이다.

A instanceof B 의 의미는,

"A 가 B의 자식이니 ?" = "A는 B의 프로토타입 체인 하위에 속해있니?"

 

예시코드 :

var Person = function () { this.age = 5 } ;
var Annie = new Person() ;

Annie instanceof Person ; // true
Annie instanceof Object ; // true

해석 : 넌 나의 인스턴스다

 

돌발퀴즈 :

// Q1
[1, 2] instanceof Array ;
{ a: "aa" } instanceof Object ;
// 출력 결과는 ?

//Q2
true instanceof Boolean ;
"A" instanceof String ;
// 출력 결과는 ?

//Q3
var str = new String("def") ;
var str2 = "abc" ;
str instanceof String ;
str2 instanceof String ;
// 출력 결과는 ?

정답공개 :

더보기

Q1 정답 [ true, true ]

Q2 정답 [ false, false ]

Q3 정답 [ true, false ]

 

 

 

 

얼마나 맞췄나요? ㅎㅎ

이제 해설을 해보겠다.

 

Q1 [], {} 는 new Array, new Object 와 똑같다

이 두가지만 예외인듯하다. 정확히 똑같은 의미를 가진다.

[ 1, 2 ] 는 new Array(1, 2) 와 똑같기 때문에 instanceof 실행시 true를 반환한다.

{ a: "aa" } 도 마찬가지.

 

Q2 상상도 못한 primitive type 의 존재

"A" 는 String 객체의 하위에 속해있지 않다.

true나 false도 Boolean 객체 하위에 속해있지 않다.

 

사실 잘 생각해보면 이해할 수 있다.

모든 숫자 1, 123, 1425 가 전부 객체일 수도 없고,

이 객체들이 Int(라는 객체는 없지만) 하위 객체로 속할 수도 없다.

 

이 값들은 그냥 Primitive type (기본타입) 의 한 값일 뿐이다.

 

한가지 반전이 더 있는데,

String, Boolean은 함수객체이다.

 

Q3 "??? : 우리가 경우란 경우는 다 어기고 살지만은... 너하고 난 경우 따져야지!"

팍철용의 명대사 중

겉으론 같아 보이지만, 이 둘은 경우 따져야 한다.

 

"A" 는 객체가 아니지만,

new String("A") 는 객체로 선언한 것이 된다.

 

놀랍지 않은가 ㄷㄷㄷㄷ

참고로 하나 더,

자바스크립트는 char 형은 없다.

모두가 문자열이다.

 

 

마지막으로 정리하자면,

instanceof 는 prototype chain 하위에 속해있는지 확인해 true / false 값을 반환해주는 비교연산자이며,

[], {} 이 두 케이스는 new Array, new Object 와 정확히 같은 의미라,

각각 Array, Object의 instance가 맞다.

 

이 둘을 제외한 String, Boolean 등 직접 선언된 값들은 객체가 아니라,

primitive type 값이다.

따라서 어떤 것의 instance도 될 수 없다.

 

 

 

참고자료 : unikys.tistory.com/260

 

 

 

반응형