HOWTO · JavaScript
JavaScript에서 값이 객체인지 확인
이 튜토리얼에서는 값이 JavaScript의 객체인지 확인합니다.
이 페이지의 내용
JavaScript 값이 객체인지 확인하려면 typeof value === "object" && value !== null을 사용합니다. 이 조건은 배열을 비롯한 객체에는 참을 반환하고 null과 함수에는 거짓을 반환합니다. 함수도 허용해야 한다면 조건에 typeof value === "function"을 추가하세요. JavaScript에서는 함수를 호출 가능한 객체로 취급하지만 typeof는 함수를 별도로 보고하므로, 프로그램의 요구에 맞는 규칙을 선택해야 합니다.
instanceof 연산자로 JavaScript 값이 객체인지 확인하기
instanceof는 생성자의 프로토타입이 값의 프로토타입 체인에 있는지 확인하는 연산자입니다. 같은 JavaScript 영역에서 만든 일반 객체라면 value instanceof Object가 참인 경우가 많습니다. 따라서 value instanceof Date처럼 특정 생성자와 연결된 인스턴스인지 확인할 때 유용합니다.
하지만 모든 객체를 판별하는 범용 조건은 아닙니다. Object.create(null)로 만든 객체에는 체인에 Object.prototype이 없으므로 instanceof Object가 거짓입니다. 다른 브라우저 창이나 iframe처럼 별도의 영역에서 만든 객체도 생성자와 프로토타입이 다릅니다. 따라서 그 영역의 객체는 현재 영역의 instanceof Object 검사에서 거짓이 될 수 있습니다. 이런 경우까지 포함해 일반적인 객체 판별이 필요하다면 typeof를 기반으로 한 조건을 사용하세요.
typeof 연산자로 JavaScript 값이 객체인지 확인하기
typeof는 함수가 아니라 연산자이며, 값 주위에 괄호를 붙일 필요가 없습니다. 배열을 포함한 일반 객체에 typeof value를 적용하면 "object"가 반환됩니다. 기억해야 할 결과가 두 가지 있습니다. typeof null도 "object"를 반환하지만, 함수에 typeof를 적용하면 "function"을 반환합니다. 따라서 결과가 "object"인지 확인하는 것만으로는 null이 포함되고 함수는 제외됩니다. null은 제외하고 객체만 확인하려면 명시적으로 null인지 검사하세요.
재사용 가능한 객체 검사 조건 정의하기
이 조건은 null이 아닌 객체에는 참을, 함수와 원시값, null에는 거짓을 반환합니다. 예제에서는 객체, null 값, 숫자, 함수에 적용했을 때의 결과를 보여줍니다.
function isObject(value) {
return value !== null && typeof value === "object";
}
const person = { name: "Ada" };
console.log(isObject(person));
console.log(isObject(null));
console.log(isObject(42));
console.log(isObject(() => {}));
각 호출은 입력값과 같은 순서로 불리언 결과 하나씩을 출력합니다. 이 정의가 확인하는 것은 의도적으로 “null이 아닌 객체인가?”입니다. 사용 사례에서 함수를 포함해야 한다면 value !== null && (typeof value === "object" || typeof value === "function")을 사용하세요. 이 목적으로 value.constructor.toString()을 검사하는 방식은 피해야 합니다. 값에 예상한 생성자가 없을 수 있고, 생성자 이름이나 소스 텍스트는 일반적인 타입 검사에 신뢰할 수 없기 때문입니다. Object(value) === value 패턴도 변환 동작 때문에 조건이 의도한 의미를 흐릴 수 있습니다.
Object.getPrototypeOf()로 객체의 프로토타입 살펴보기
Object.getPrototypeOf(value)는 다른 질문에 답합니다. 객체의 프로토타입을 반환합니다. 예를 들어 Object.getPrototypeOf(Object.create(null))은 null을 반환하고, Object.getPrototypeOf({})는 Object.prototype을 반환합니다. 이 메서드는 상속 관계를 살펴보거나 값의 프로토타입을 알려진 프로토타입과 비교할 때 유용하지만, 객체 판별 조건을 대신하지는 않습니다. null 또는 undefined를 Object.getPrototypeOf()에 전달하면 TypeError가 발생합니다. 다른 원시값은 프로토타입을 반환하기 전에 객체로 변환됩니다. 일반적인 객체 판별이 아니라 프로토타입을 확인해야 할 때 이 메서드를 사용하세요.