Object.prototype.toString.call({}) // "[객체 객체]"
Object.prototype.toString.call(2) // "[객체 번호]"
ES5 팁: ECMAScript 5에서는 편의상 Object.prototype.toString 메서드가 null 및 정의되지 않은 상태에서 호출되고 해당 반환 값이 Object에서 Null 및 Undefine으로 변경됩니다.
번역자 주: 이 변경 사항은 아래와 같이 IE8 및 Firefox 4에서 볼 수 있습니다.
// IE8
Object.prototype.toString.call(null) // "[object Object]"
Object.prototype.toString.call ( 정의되지 않음) // "[객체 객체]"
// Firefox 4
Object.prototype.toString.call(null) // "[객체 Null]"
Object.prototype.toString . call(undefine) // "[object Undefine]"
정의되지 않은 변수 테스트
typeof foo !== 'undefine'
위 코드는 foo가 정의되었는지 여부를 감지합니다. 정의되지 않고 직접 사용되지 않으면 ReferenceError 예외가 발생합니다. 이것은 typeof가 유용한 유일한 장소입니다.
결론
객체의 유형을 감지하려면 Object.prototype.toString 메서드를 사용하는 것이 가장 신뢰할 수 있는 방법이므로 적극 권장됩니다. 위 표에서 볼 수 있듯이, typeof의 일부 반환 값은 표준 문서에 정의되어 있지 않으므로 엔진 구현마다 다를 수 있습니다.
변수가 정의되었는지 확인하려는 경우가 아니면 typeof 연산자를 사용하지 않도록 노력해야 합니다.
instanceof 연산자
instanceof 연산자는 두 피연산자의 생성자를 비교하는 데 사용됩니다. 사용자 정의 개체를 비교할 때만 의미가 있습니다. 내장 유형을 비교하는 데 사용된다면 typeof 연산자만큼 쓸모가 없습니다.
사용자 정의 개체 비교
function Foo() {}
function Bar() {}
Bar.prototype = new Foo()
new Bar() instanceof Bar; // true
new Bar() instanceof Foo; // true
// Foo 생성자의 인스턴스가 아닌 Foo 함수 자체에만 Bar.prototype을 설정하는 경우
Bar.prototype = Foo; ) instanceof Foo; // false
`instanceof` 기본 유형과 함께 `instanceof` 사용)
new String('foo') instanceof String; // true
new String('foo ') instanceof Object; // true
'foo' instanceof String; // false
'foo' instanceof Object; // false
한 가지 주의할 점은, instanceof 오류가 발생하는 경우입니다. 생성자가 동일한 객체가 아니기 때문에 서로 다른 JavaScript 컨텍스트(예: 브라우저의 서로 다른 문서 구조)에 속하는 객체를 비교합니다.
결론적으로, instanceof 연산자는 동일한 JavaScript 컨텍스트의 사용자 정의 개체를 비교하는 데에만 사용해야 합니다. `typeof` 연산자와 마찬가지로 다른 사용법은 피해야 합니다.