자바 스크립트에서 값이 객체인지 확인


1363

JavaScript에서 값이 객체인지 어떻게 확인합니까?


4
변수는 변수입니다. 객체를 가리킬 수 있습니다. 또한 "객체"를 정의하고 싶을 수도 있습니다. 답변과 의견에서 알 수 있듯이 다양한 상충되는 정의가 있습니다 (예 : null객체 인지 여부 ).

8
OP, IMO는 @Daan의 답변이 가장 좋은 해결책이므로 다른 답변보다 먼저 표시되도록 @Daan의 답변을 수락해야합니다. (좋은 답변을 가진 다른 사람들에게도 공격이 없습니다.)
tiffon

2
IMHO 그것은 실제로 당신 (이 질문에 대한 답을 찾는 사람)이 객체를 고려한 것과 왜 그것을 확인하고 있는지에 달려 있습니다. 당신은 배열 (즉 구별하려는 경우이 질문에 다른 대답을 제공합니다 수 있습니다 에서 객체) 다른 당신이 "벡터"에서 스칼라 값을 구분하려는 경우 개체 나. 널 (null) (즉 여부를 그리고 있다 대해서 typeof에 따라, 객체) 또는 (기능 이다 오브젝트)를 제외 여부를해야한다, 정말 당신이 그것을 확인하는 이유에 따라 달라집니다. 그렇기 때문에 답변이 너무 많고 대부분의 상황에서 정확합니다.
FrancescoMM

const isEmpty = 일 => {typeof 일 === "개체"? ! thing || ! Object.keys (thing) .length :! thing && 일! == 0};
Mayur S

1
당신이 정확히 무엇을 말함으로써 시작할 수 있다면 그것은 좋은 것입니다 당신이 "객체는"뜻. (또는, 당신이 찾고있는 대답의 일부는 "객체"라는 다양한 대중적 의미를 파악한 다음 구별하는 것입니다.
Don Hatch

답변:


520

업데이트 :

이 답변은 불완전하며 잘못된 결과를 제공합니다 . 예를 들어, 몇 가지 다른 경우는 말할 것도없고 JavaScript null의 유형 object으로 간주됩니다 . 아래 권장 사항을 따르고 다른 "가장 올 바르고 올바른 답변" 으로 넘어갑니다 .


원래 답변 :

typeof(var)및 / 또는을 사용해보십시오 var instanceof something.

편집 :이 답변은 변수의 속성을 검사하는 방법에 대한 아이디어를 제공하지만 객체가 아닌지 확인하는 방탄 레시피 는 아닙니다 (결국 레시피가 전혀 없습니다!). 사람들은 아무 연구도하지 않고 여기에서 복사 할 무언가를 찾는 경향이 있기 때문에, 가장 반대의 답변을하고 다른 답변을 찾는 것이 좋습니다.


208
typeof연산자이므로을 (를) 필요로하지 않습니다 ().
Yoshi

67
예, 필요 없습니다. 난 그냥 이런 식으로 선호합니다.
Michael Krelin-해커

150
@ MichaelKrelin-hacker : 사람들혼동하기 때문에 불행합니다 .
RightSaidFred

11
@RightSaidFred, 나는 그것에 대해 설명이 없지만, 나는이 표현에 대괄호를 추가하는 경향이 절대적으로 없습니다 :)
Michael Krelin-hacker

117
이 답변은 잘못되었습니다. typeofnull이 아닌 경우 'object'를 반환합니다.이 값은 객체 instanceof가 아니며를 사용하여 만든 객체에는 작동하지 않습니다 Object.create(null).
Nikolai

1632

인 경우 typeof yourVariable === 'object'객체이거나 null입니다. null을 제외하려면 그냥 만드십시오 typeof yourVariable === 'object' && yourVariable !== null.


31
기능은 또한 객체이며 점검에 포함되어야합니다.
JS_Riddler

4
이 경우 yourVariable !== null더 나은 연습이 될까요?
hippietrail

9
@RightSaidFred ES6typeof null == 'object' 에서 수정되지 않는 것 같습니다 . 그들은 말했다 :This proposal has been rejected. It was implemented in V8 but it turned out that it broke a lot of existing sites. In the spirit of One JavaScript this is not feasible.
Konstantin Smolyanin

2
@Orion 간단한 대답은 배열이 객체로 간주된다는 것입니다. 더 자세한 답변을 typeof위해서는 반드시 이해해야 할 몇 가지 특별한 경우 가 있으므로 자세히 읽어보십시오 . 배열과 배열이 아닌 객체를 구별하려고하면 분명히 사용하고 싶지 않습니다 typeof.
매트 펜윅

8
가장 좋은 방법은 @Tresdin하여 실행하는 것입니다 Object.prototype.toString.call(yourVar)되고, yourVar을 당신이 검사 할 필요. 배열의 경우 Object.prototype.toString.call([1,2])반환[object Array]
Jose Rui Santos

538

Javascript에서 "object"를 정의 해 봅시다 . MDN docs 에 따르면 모든 값은 객체 또는 기본 요소입니다.

원시적, 원시적 가치

개체가 아니며 메서드가없는 데이터입니다. JavaScript에는 문자열, 숫자, 부울, 널, 정의되지 않은 5 가지 기본 데이터 유형이 있습니다.

프리미티브 란 무엇입니까?

  • 3
  • 'abc'
  • true
  • null
  • undefined

객체 란 무엇입니까 (즉 기본 요소가 아님)?

  • Object.prototype
  • 모든 것이 후손 Object.prototype
    • Function.prototype
      • Object
      • Function
      • function C(){} -사용자 정의 함수
    • C.prototype-사용자 정의 함수의 프로토 타입 속성 : 이것은 아닙니다 C 프로토 타입
      • new C() -사용자 정의 함수 "신규"
    • Math
    • Array.prototype
      • 배열
    • {"a": 1, "b": 2} 리터럴 표기법을 사용하여 생성 된 객체
    • new Number(3) 프리미티브 주변의 래퍼
    • ... 다른 많은 것들 ...
  • Object.create(null)
  • 모든 것은 Object.create(null)

값이 객체인지 확인하는 방법

instanceof 두 가지 경우가 없기 때문에 자체로는 작동하지 않습니다.

// oops:  isObject(Object.prototype) -> false
// oops:  isObject(Object.create(null)) -> false
function isObject(val) {
    return val instanceof Object; 
}

typeof x === 'object'가양 성 ( null) 및가 음성 (함수)으로 인해 작동하지 않습니다 .

// oops: isObject(Object) -> false
function isObject(val) {
    return (typeof val === 'object');
}

Object.prototype.toString.call 모든 프리미티브에 대한 오탐으로 인해 작동하지 않습니다.

> Object.prototype.toString.call(3)
"[object Number]"

> Object.prototype.toString.call(new Number(3))
"[object Number]"

그래서 나는 사용합니다 :

function isObject(val) {
    if (val === null) { return false;}
    return ( (typeof val === 'function') || (typeof val === 'object') );
}

@ Dan의 대답도 효과가있는 것 같습니다.

function isObject(obj) {
  return obj === Object(obj);
}

MDN 문서 에 따르면 :

Object 생성자는 주어진 값에 대한 객체 래퍼를 만듭니다. 값이 null이거나 정의되지 않은 경우 빈 객체를 만들어 반환하고, 그렇지 않으면 주어진 값에 해당하는 유형의 객체를 반환합니다. 값이 이미 개체 인 경우 값을 반환합니다.


작동하는 것처럼 보이는 세 번째 방법 (100 %인지 확실하지 않음)은 인수가 객체가 아닌 경우 예외Object.getPrototypeOfthrow하는 사용 하는 것입니다.

// these 5 examples throw exceptions
Object.getPrototypeOf(null)
Object.getPrototypeOf(undefined)
Object.getPrototypeOf(3)
Object.getPrototypeOf('abc')
Object.getPrototypeOf(true)

// these 5 examples don't throw exceptions
Object.getPrototypeOf(Object)
Object.getPrototypeOf(Object.prototype)
Object.getPrototypeOf(Object.create(null))
Object.getPrototypeOf([])
Object.getPrototypeOf({})

22
obj === Object(obj)true배열을 반환 합니다.
Onur Yıldırım

5
var x = []; console.log(x === Object(x)); // return true
Illuminator

6
@ 일루미네이터 배열 내 대답에서 언급했듯이 Javascript의 객체입니다.
매트 펜윅

1
getPrototypeOf예를 들어, 객체이지만 던져지는 취소 된 프록시에서는 작동하지 않습니다.
Oriol

2
({}).toString.apply(obj) === '[object Object]'이것이 배열이 아닌 배열과 객체를 구별 하지 않는 이유
MauricioJuanes

295

underscore.js 는 무언가 실제로 객체인지 확인하기 위해 다음 방법을 제공합니다.

_.isObject = function(obj) {
  return obj === Object(obj);
};

최신 정보

V8의 이전 버그와 작은 마이크로 속도 최적화로 인해 방법은 underscore.js 1.7.0 (2014 년 8 월) 이후 다음과 같습니다 .

_.isObject = function(obj) {
  var type = typeof obj;
  return type === 'function' || type === 'object' && !!obj;
};

57
자바 스크립트에서 배열은 객체이기도하므로 대부분 배열을 제외 return obj === Object(obj) && Object.prototype.toString.call(obj) !== '[object Array]'
시키려고합니다

22
왜 배열을 제외하겠습니까? 본격적인 물건입니다.
Nikolai

65
대부분의 경우 함수의 입력으로서 {}를 []와 구별하기를 원하기 때문에
Daan

5
@Nickolai .. 그리고 중첩 된 객체를 반복합니다.
Ricky Boyce

6
좋은 대답입니다. 처리합니다 null. 허용되는 답변이어야합니다.
tiffon

179

Object.prototype.toString.call(myVar) 돌아올 것이다 :

  • "[object Object]" myVar가 객체 인 경우
  • "[object Array]" myVar가 배열 인 경우
  • 기타

이에 대한 자세한 내용과 typeof를 대체 할 수있는 좋은 이유는 이 기사를 확인하십시오 .


12
나는 최근에 그것을 배웠다 typeof [] === 'object'-> true. 이것이이 방법이 필요한 것입니다.
Jondlm

3
@Christophe 프리미티브와 객체를 구분하지 않습니다 . Object.prototype.toString.call(3)-> "[object Number]". Object.prototype.toString.call(new Number(3))-> "[object Number]"
Matt Fenwick

3
@MattFenwick 나는 이것이 OP가 식별하려고하는 일종의 "객체"라고 생각하지 않는다
Christophe

3
@Christophe 왜 그렇게 생각하십니까? IMHO는 "개체"에 대해 OP가 제공 한 다른 정의가 없으면 ECS 사양 전체에서 일관되게 사용되는 정의를 사용하는 것이 가장 합리적입니다.
매트 펜윅

getType=function(obj){return Object.prototype.toString.call(obj).match(/\[object (\w+)\]/)[1];};
Mr. Polywhirl

115

추가 함수 호출 (속도)없이 객체 또는 배열을 간단히 확인하십시오. 또한 여기에 게시 되었습니다 .

isArray ()

isArray = function(a) {
    return (!!a) && (a.constructor === Array);
};
console.log(isArray(        )); // false
console.log(isArray(    null)); // false
console.log(isArray(    true)); // false
console.log(isArray(       1)); // false
console.log(isArray(   'str')); // false
console.log(isArray(      {})); // false
console.log(isArray(new Date)); // false
console.log(isArray(      [])); // true

isObject () -참고 : new Date 또는 new YourCustomObject와 같은 사용자 정의 객체에 대해 false를 반환하므로 Object 리터럴에만 사용하십시오.

isObject = function(a) {
    return (!!a) && (a.constructor === Object);
};
console.log(isObject(        )); // false
console.log(isObject(    null)); // false
console.log(isObject(    true)); // false
console.log(isObject(       1)); // false
console.log(isObject(   'str')); // false
console.log(isObject(      [])); // false
console.log(isObject(new Date)); // false
console.log(isObject(      {})); // true

isObject객체 리터럴에서만 작동합니다. 나는 사용자 정의 유형을 작성하는 경우, 그것을 유형의 인스턴스를 생성하고 테스트, 그것은 반환false
WickyNilliams

3
@zupa : 무엇 !!

4
@ 3000 글쎄, (!! a) 부분을 생략하면 null과 undefined에 생성자가 없기 때문에 충돌이 발생합니다. (!! a) 그것들을 걸러냅니다. 그 질문에 대답합니까?
zupa

2
@zupa @ 3000 Boolean(a)은 더 길지만 훨씬 직관적입니다. 그냥 사용하지 마십시오 new Boolean(a): ( 여기 이유가 있습니다 )!
JayVee

10
가장 좋은 대답은 지금까지 페이지 아래쪽에 있습니다. 이것은 기본적으로 질문에 대답합니다-이것이 JSON으로 {문자로 시작하는 것으로 표현됩니까 ? 배열의 경우 IE <9를 지원할 필요가없는 한 Array.isArray()무언가가 배열인지 확인 하는 데 사용할 수 있습니다 . 제공 한 모든 테스트 사례를 통과합니다.
Kip

81

나는 단순히 좋아한다 :

function isObject (item) {
  return (typeof item === "object" && !Array.isArray(item) && item !== null);
}

항목은 JS 객체이며, 그것은 JS 배열이 아니다, 그것이 아니라면 null... 셋 모두, 반환 사실을 증명하는 경우 true. 세 가지 조건 중 하나라도 실패하면 &&테스트가 단락되어 false반환됩니다. null원하는 경우 시험은 생략 할 수 있습니다 (사용 방법에 따라null ).

DOCS :

http://devdocs.io/javascript/operators/typeof

http://devdocs.io/javascript/global_objects/object

http://devdocs.io/javascript/global_objects/array/isarray

http://devdocs.io/javascript/global_objects/null


3
console.log (isObject (new Date ()))는 어떻습니까? 왜 날짜는 객체이지만 배열은 아니어야합니까?
schirrmacher 2016 년

5
@macher new Date()객체를 반환하기 때문입니다. JavaScript는 객체를 처리하고보고하지만 배열은 객체가 아닌 논리적 관점에서 나온 것입니다. 그러나 실제로는 동일하지 않으므로 동일하게 보는 것이 도움이되지 않습니다. length예를 들어 객체에는 속성이 없으며 push ()와 같은 메서드가 없습니다. 그리고 때로는 다른 매개 변수가 주어진 매개 변수에 의존하는 경우 배열이나 객체간에 차이를 만들어야하는 함수 과부하 매개 변수를 제공 할 수 있습니다.
StanE

1
@StanE 배열은 확실히 객체입니다. 확실하지 왜 객체가 가질 수 없다고 생각 length처럼 재산이나 방법을 push, Object.create(Array.prototype)다음이있는 배열이 아닌 객체의 사소한 반례입니다. 배열을 특별하게 만드는 것은 사용자 정의 [[DefineOwnProperty]] 필수 내부 메소드가있는 이국적인 오브젝트이지만 여전히 오브젝트라는 것입니다.
Oriol

4
@Oriol 나는 배열이 객체가 아니라고 말하지 않았으며 객체가 length속성을 가질 수 없다고 썼다 ( length기본적으로 객체 리터럴에는 속성 이 없음을 의미 함 ). 나는 배열이 논리적 관점 에서 객체가 아니라고 썼다 . 프로그램 논리에 대해 이야기하고 있습니다. 배열이 "실제"배열이고 "실제"객체가 아닌지 확인해야하는 경우가 있습니다. 그게 다야 Array.isArray(). 객체 또는 객체의 배열을 받아들이는 함수가 있다고 상상해보십시오. 특별한 속성이나 메소드를 확인하는 것은 더러운 해결책입니다. 기본 방식은 항상 좋습니다.
StanE

2
typeof null있다 "object", 없다 "undefined".
2540625

80

기능으로 Array.isArray:

function isObject(o) {
  return o !== null && typeof o === 'object' && Array.isArray(o) === false;
}

기능없이 Array.isArray:

얼마나 많은 upvotes 오답 😮 그냥 놀랄
한 대답은 내 테스트를 통과! 여기에 간단한 버전을 만들었습니다.

function isObject(o) {
  return o instanceof Object && o.constructor === Object;
}

나를 위해, 그것은 명확하고 간단하며 작동합니다! 여기 내 테스트 :

console.log(isObject({}));             // Will return: true
console.log(isObject([]));             // Will return: false
console.log(isObject(null));           // Will return: false
console.log(isObject(/.*/));           // Will return: false
console.log(isObject(function () {})); // Will return: false

한 번 더 : 모든 답변이이 테스트를 통과하는 것은 아닙니다 !!! 🙈


객체가 특정 클래스의 인스턴스 인지 확인 해야하는 경우 다음 과 같이 특정 클래스로 생성자를 확인해야합니다.

function isDate(o) {
  return o instanceof Object && o.constructor === Date;
}

간단한 테스트 :

var d = new Date();
console.log(isObject(d)); // Will return: false
console.log(isDate(d));   // Will return: true

결과적으로 엄격하고 강력한 코드를 갖게됩니다!


혹시 같은 기능을 만들지 않습니다 isDate, isError, isRegExp,이 일반화 된 기능을 사용할 수있는 옵션을 고려할 수 등 :

function isObject(o) {
  return o instanceof Object && typeof o.constructor === 'function';
}

앞에서 언급 한 모든 테스트 사례에서 올바르게 작동하지는 않지만 모든 객체 (일반 또는 생성)에는 충분합니다.


isObjectObject.create(null)내부 구현 으로 인해 여기Object.create 에 설명되어 있기 때문에 작동하지 않지만 보다 정교한 구현에 사용할 수 있습니다 .isObject

function isObject(o, strict = true) {
  if (o === null || o === undefined) {
    return false;
  }
  const instanceOfObject = o instanceof Object;
  const typeOfObject = typeof o === 'object';
  const constructorUndefined = o.constructor === undefined;
  const constructorObject = o.constructor === Object;
  const typeOfConstructorObject = typeof o.constructor === 'function';
  let r;
  if (strict === true) {
    r = (instanceOfObject || typeOfObject) && (constructorUndefined || constructorObject);
  } else {
    r = (constructorUndefined || typeOfConstructorObject);
  }
  return r;
};

이 구현을 기반으로 npm v1 이미 패키지 가 생성 되었습니다 ! 그리고 이전에 설명한 모든 테스트 사례에서 작동합니다! 🙂


가장 좋은 답변! 여기에
일함

이것은 isObject (myDateObject)에 대해 false를 반환하기 때문에 질문에 대한 답변이 아닙니다. 변수가 객체인지 아닌지, 특정 클래스의 객체 인 경우에만 알려줍니다. 여기서 질문은 모든 객체에 대해 true를 반환하는 일반 함수에 관한 것입니다.
Yetanotherjosh

@Yetanotherjosh 그것은 실제로 당신이 대답에 설명 된 사례에 대해 언급 한 답변이며 요점은 isDate강력한 코드를 작성 하기 위해 yourDateObject 에 사용해야 한다는 것 isObject입니다. 그렇지 않으면 취성이있는 방법이 있습니다.
V. Kovpak

@VladimirKovpak Date예, 대답이 토론하기 때문에 내 의견에 사용 하는 것은 잘못 선택되었습니다 Date. 그러나 Date무한한 클래스 중 하나 일뿐 아니라 다른 클래스에도 적용됩니다. 예 :를 class Foo() { }; var x = new Foo(); isObject(x)반환합니다 false. OP의 유스 케이스가 무엇인지 정확히 알지 못하지만 가능한 모든 클래스 에 대해 알아야하고 클래스 에 대해 구체적으로 점검 하는 것은 불가능한 시나리오를 쉽게 생각할 수 있습니다.
Yetanotherjosh

@Yetanotherjosh 내 답변을 업데이트했습니다. 그리고 1 건 더 추가했습니다.
V. Kovpak

40

세상에! 나는 이것이 이전보다 더 짧을 수 있다고 생각한다.

짧은 최종 코드

function isObject(obj)
{
    return obj != null && obj.constructor.name === "Object"
}

console.log(isObject({})) // returns true
console.log(isObject([])) // returns false
console.log(isObject(null)) // returns false

설명

반품 유형

대해서 typeof 자바 스크립트 (포함 개체 null) 반환"object"

console.log(typeof null, typeof [], typeof {})

그들의 생성자 확인

constructor속성을 확인 하면 이름과 함께 함수가 반환됩니다.

console.log(({}).constructor) // returns a function with name "Object"
console.log(([]).constructor) // returns a function with name "Array"
console.log((null).constructor) //throws an error because null does not actually have a property

Function.name 소개

Function.name함수 또는 "anonymous"클로저에 대한 읽기 전용 이름을 반환합니다 .

console.log(({}).constructor.name) // returns "Object"
console.log(([]).constructor.name) // returns "Array"
console.log((null).constructor.name) //throws an error because null does not actually have a property

참고 : 2018 년 현재 Function.name은 IE https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/name#Browser_compatibility 에서 작동하지 않을 수 있습니다


3
나는 이것을 짧고 요점으로 정말 좋아합니다. 내가 볼 수있는 한 하나만 실패합니다. obj = Object.create(null)그리고 왜 그렇게 할 것입니까?
줄리안 나이트

29

자, 질문에 대답하기 전에 먼저이 개념을 알려 드리겠습니다. JavaScript 함수에는 Object, null, Object, Arrays 및 Date조차도 있습니다. 따라서 typeof obj === 'object'와 같은 간단한 방법 은 없습니다 . 위에서 언급 한 모든 것이 true반환합니다 하지만 함수를 작성하거나 JavaScript 프레임 워크를 사용하여 확인하는 방법이 있습니다.

이제이 객체가 실제 객체 (null 또는 함수 또는 배열이 아님) 인 것으로 가정합니다.

var obj = {obj1: 'obj1', obj2: 'obj2'};

순수한 자바 스크립트 :

//that's how it gets checked in angular framework
function isObject(obj) {
  return obj !== null && typeof obj === 'object';
}

또는

//make sure the second object is capitalised 
function isObject(obj) {
   return Object.prototype.toString.call(obj) === '[object Object]';
}

또는

function isObject(obj) {
    return obj.constructor.toString().indexOf("Object") > -1;
}

또는

function isObject(obj) {
    return obj instanceof Object;
}

코드에서 위의 함수 중 하나를 호출하여 사용할 수 있으며 객체 인 경우 true를 반환합니다.

isObject(obj);

JavaScript 프레임 워크를 사용하는 경우 일반적으로 이러한 종류의 기능을 준비한 것입니다.

jQuery :

 //It returns 'object' if real Object;
 jQuery.type(obj);

모난:

angular.isObject(obj);

밑줄과 Lodash :

//(NOTE: in Underscore and Lodash, functions, arrays return true as well but not null)
_.isObject(obj);

또한 배열이 아닌지 확인하고 싶습니다. 따라서 함수 isObject (obj) {return obj! == null && typeof obj === 'object'&&! Array.isArray (obj); }
Matt Goo

나는 당신에 동의하지만, 당신이 의견에서 볼 수 있듯이, 그것은 angularJs에서 수행되는 방식이며 함수 앞에서 주석에서 언급합니다. 배열을 객체로 계산합니다 ... 자세한 내용은 여기를보십시오 : docs .angularjs.org / api / ng / function / angular.isObject
Alireza

24

"객체"란 무엇을 의미하는지에 달려 있습니다. 프리미티브 가 아닌 모든 것, 즉 새로운 속성을 설정할 수 있는 모든 것을 원한다면 트릭을 수행해야합니다.

function isAnyObject(value) {
    return value != null && (typeof value === 'object' || typeof value === 'function');
}

이 프리미티브를 제외 (일반 번호 / NaN/ Infinity일반 문자열, 문자, true/ false, undefinednull)하지만 다른 모든 것들 (포함에 true를 돌려 Number, BooleanString객체). 참고 JS 같은 "호스트"개체을 정의하지 않습니다 window또는 console함께 사용할 경우, 반환해야typeof 하는이 같은 검사 커버하기 어려운, 그래서.

무언가가 "평범한"객체인지, 즉 리터럴 {}또는 로 만든 객체인지 알고 싶다면 다음과 같이 Object.create(null)하십시오.

function isPlainObject(value) {
    if (Object.prototype.toString.call(value) !== '[object Object]') {
        return false;
    } else {
        var prototype = Object.getPrototypeOf(value);
        return prototype === null || prototype === Object.prototype;
    }
}

2018 편집 : Symbol.toStringTag의 출력을 사용자 정의 할 수 있기 때문에 객체의 수명이 리터럴로 시작된 경우에도 위 Object.prototype.toString.call(...)isPlainObject함수가 반환 false되는 경우 가 있습니다 . 아마도 관습에 따라 사용자 정의 문자열 태그가있는 객체는 더 이상 평범한 객체가 아니지만 일반 객체가 Javascript에있는 것의 정의를 더 흐리게합니다.


typeof === 'function'이 (가) 객체로 간주되는 이유는 무엇입니까? 함수는 객체가 아닙니다. "new myFunc ()"는 객체가 될 것입니다. 그러나 일반 함수입니까?
StanE

아니요, 모든 함수는 작성 방법에 관계없이 Javascript의 객체입니다. 고정되지 않은 경우 속성을 설정할 수 있습니다 instanceof Object. 두 개의 동일한 함수 리터럴이 엄격하게 같지 않고 참조로 전달됩니다.
last-child

21

하나님, 다른 답변에 너무 혼란.

짧은 답변

typeof anyVar == 'object' && anyVar instanceof Object && !(anyVar instanceof Array)

이를 테스트하려면 크롬 콘솔에서 다음 명령문을 실행하십시오.

사례 1.

var anyVar = {};
typeof anyVar == 'object' && anyVar instanceof Object && !(anyVar instanceof Array) // true

사례 2.

anyVar = [];
typeof anyVar == 'object' && anyVar instanceof Object && !(anyVar instanceof Array) // false

사례 3.

anyVar = null;
typeof anyVar == 'object' && anyVar instanceof Object && !(anyVar instanceof Array); // false

설명

알았어 분해하자

typeof anyVar == 'object' 세 후보에서 true로 반환됩니다. [], {} and null .

anyVar instanceof Object 이 후보들을 둘로 좁 힙니다- [], {}

!(anyVar instanceof Array) 하나만 좁 힙니다. {}

드럼 롤주세요!

이것으로 Javascript에서 Array를 확인하는 방법을 이미 배웠을 것입니다.


2
주목할 사항 은 함수일 false때 (원하는대로) 반환 anyVar합니다.
Jamie Birch

18

값의 유형을 확인하는 가장 합리적인 방법은 typeof연산자입니다. 유일한 문제는 그것이 끔찍하게 고장났다는 것입니다.

  • "object"대한 반환null 널 유형에 속한.
  • 반환 "function"객체 유형에 속하는 호출 가능한 객체를 합니다.
  • 호출 할 수없는 비표준 객체에 대해 원하는 것을 거의 반환 할 수 있습니다. 예를 들어 IE는 좋아하는 것 같습니다 "unknown". 금지 된 결과는 "function"기본 형식입니다.

typeofnull프리미티브 가 아닌 경우에만 신뢰할 수 있습니다. 따라서 값이 객체인지 확인하는 방법은 반환 된 문자열 typeof이 프리미티브에 해당하지 않고 객체가 아닌지 확인하는 것입니다null 입니다. 그러나 문제는 미래의 표준이 새로운 기본 유형을 도입 할 수 있으며 코드에서 객체로 간주한다는 것입니다. 새로운 유형은 자주 나타나지 않지만 ECMAScript 6과 같이 Symbol 유형이 도입되었습니다.

따라서 대신 typeof 값이 객체인지 여부에 따라 결과가 다른 접근법 만 권장합니다. 다음은

값이 Object 유형에 속하는지 테스트하는 적절한 방법의 포괄적이지만 완전한 목록은 아닙니다.

  • Object 건설자

    Object생성자는 객체에 전달 된 인수를 강제 변환. 이미 객체 인 경우 동일한 객체가 반환됩니다.

    따라서이 값을 사용하여 값을 객체로 강제 변환하고 해당 객체를 원래 값과 엄격하게 비교할 수 있습니다.

    다음 기능을 사용하려면 ECMAScript 3이 필요합니다 ===.

    function isObject(value) { /* Requires ECMAScript 3 or later */
      return Object(value) === value;
    }

    이 방법은 간단하고 자체 설명 적이므로 부울, 숫자 및 문자열에 대해서도 유사한 검사가 작동하기 때문에이 방법을 좋아합니다. 그러나 Object그림자가 적용되지 않거나 변경되지 않는 전역에 의존한다는 점에 유의하십시오.

  • 생성자

    생성자를 인스턴스화하면 방금 생성 한 인스턴스와 다른 값을 반환 할 수 있습니다. 그러나 그 값은 객체가 아닌 한 무시됩니다.

    다음 함수에는 ECMAScript 3이 필요하므로 생성자가 객체가 아닌 객체를 반환 할 수 있습니다. ECMAScript 3 이전에는 오류가 발생했지만 try그 당시에는 진술이 없었습니다.

    function isObject(value) { /* Requires ECMAScript 3 or later */
      return new function() { return value; }() === value;
    }

    이전 예제보다 약간 단순하지는 않지만이 속성은 전역 속성에 의존하지 않으므로 가장 안전 할 수 있습니다.

  • this

    이전 ECMAScript 사양에서는 this값이 객체 여야했습니다. ECMAScript 3이 도입 Function.prototype.call되어 임의의 this값 으로 함수를 호출 할 수 있었지만 객체로 강제 변환되었습니다.

    ECMAScript 5는이 동작을 제거하는 엄격한 모드를 도입했지만, 조잡한 모드에서는 여전히 신뢰할 수는 있지만 의존해서는 안됩니다.

    function isObject(value) { /* Requires ECMAScript 3 or later in sloppy mode */
      return function() { return this === value; }.call(value);
    }
  • [[원기]]

    모든 일반 객체에는 [[Prototype]]이라는 내부 슬롯이 있으며 그 값에 따라 상속되는 다른 객체가 결정됩니다. 값은 객체 또는 만 될 수 있습니다 null. 따라서 원하는 값에서 상속되는 개체를 만들어서 작동하는지 확인할 수 있습니다.

    모두 Object.createObject.getPrototypeOf인 ECMAScript 5를 필요로한다.

    function isObject(value) { /* Requires ECMAScript 5 or later */
      try {
        Object.create(value);
        return value !== null;
      } catch(err) {
        return false;
      }
    }
    function isObject(value) { /* Requires ECMAScript 5 or later */
      function Constructor() {}
      Constructor.prototype = value;
      return Object.getPrototypeOf(new Constructor()) === value;
    }
  • 몇 가지 새로운 ECMAScript 6 방법

    ECMAScript 6에서는 값이 객체인지 확인하는 몇 가지 새로운 간접 방법을 소개합니다. 이전에 본 방법을 사용하여 값을 일부 코드로 전달하여 객체를 필요로하며, try문을 감싸서 오류를 포착합니다. 언급 할 가치가없는 숨겨진 예


참고 : 나는 Object.getPrototypeOf(value)(ES5) 및 Reflect메소드 (ES6 )와 같은 일부 접근 방식을 의도적으로 건너 뛰었습니다. 왜냐하면 value프록시 와 같이 불쾌한 일을 할 수있는 필수 내부 메소드를 호출하기 때문 입니다. 안전상의 이유로 제 예제는 value직접 액세스하지 않고 참조 만합니다.


2
"나의 대답과 Daan의 대답 만이 전적으로 정확합니다." 내가 처음 두 문장에 전적으로 동의하지 않는다는 점을 감안할 때 약간의 추측 입니다.
zzzzBov

1
@zzzzBov 글쎄, 나는 모든 답변을 보았고 그들은 내 것과 Daan을 제외하고 항상 올바른 답변을 반환하지는 않습니다. 나는 그들에게 재현 가능한 반례를 줄 수있다. 다른 사람들은 typeof가 "function"또는 "object"를 반환하는지 확인하는 것이 좋지만, 설명했듯이 스펙은 일부 개체에 대해 다른 결과를 허용합니다. Matt Fenwick의 답변은 Daan의 답변과 동일하지만 잘못된 답변도 포함합니다.
Oriol

1
나는 당신의 대답이 "완전히 정확하다"라는 전제에 동의하지 않았으며, 다른 사람들이 "항상 올바른 답을 항상 돌려주지 않는다"고 주장하면서 어떤 식 으로든 나의 입장을 반박하지는 않았다. 또한 질문은 어떤 입력이 어떤 출력을 생성해야하는지에 대해 어떠한 주장도하지 않습니다.
zzzzBov

1
@zzzzBov이 질문은 어떤 것이 물체인지 확인하는 방법을 묻습니다. ECMAScript는 객체가 무엇인지 정의하므로 해당 정의를 사용합니다. 나는 다른 합리적인 해석을 볼 수 없습니다. 어떤 경우에는 배열 제외와 같은 다른 작업을 수행하는 답변이 유용 할 수 있지만 어떤 것이 객체인지 확인하지는 않습니다.
Oriol

@Oriol 아마도이 질문에 대한 답변을 제공 할 수도있을 것입니다. 왜 객체가 일반 객체인지 확인하기 위해 JavaScript에 내장 메소드가없는 이유는 무엇입니까? ?
guest271314

15

이 시도

if (objectName instanceof Object == false) {
  alert('Not an object');
}
else {
  alert('An object');
}

14
부울 검사를 왜해야합니까?
jkutianski

5
이것은 두 가지 경우를 놓칩니다 Object.prototype instanceof Object.-> false. Object.create(null) instanceof Object-> 거짓.
매트 펜윅

데이트는 어때? new Date() instanceof Object => true
mauron85

13

점검 기능 사용 가능

function isObject(o) {
  return null != o && 
    typeof o === 'object' && 
    Object.prototype.toString.call(o) === '[object Object]';
}

function isDerivedObject(o) {
  return !isObject(o) && 
    null != o && 
    (typeof o === 'object' || typeof o === 'function') &&
    /^\[object /.test(Object.prototype.toString.call(o));
}

// Loose equality operator (==) is intentionally used to check
// for undefined too

// Also note that, even null is an object, within isDerivedObject
// function we skip that and always return false for null

설명

  • 자바 스크립트에서, null, Object, Array, Datefunction의 모든 개체입니다. null그럼에도 불구하고 약간의 노력이 필요합니다. 따라서 nullnull이 아닌 것을 감지 하려면 첫 번째 를 확인하는 것이 좋습니다 .

  • typeof o === 'object'그것이 o객체인지 보증 확인 . 이 검사하지 않고, Object.prototype.toString심지어 위해, 모든게에 대한 객체를 반환하기 때문에, 의미가 될 것 undefinednull! 예를 들어, toString(undefined)리턴 [object Undefined]!

    typeof o === 'object'체크 toString.call (O)가 있는지 여부를 확인하기 위해 다양한 방법으로 o목적 같은 파생 목적 Array, Date또는 function.

  • isDerivedObject기능 에서는 기능인지 확인 o합니다. 함수도 객체이기 때문에 그것이 존재하는 이유입니다. 그렇게하지 않으면 함수는 false로 반환됩니다. 예 : isDerivedObject(function() {})를 반환 false하지만 이제는를 반환합니다 true.

  • 객체의 정의를 항상 변경할 수 있습니다. 따라서 이러한 기능을 적절히 변경할 수 있습니다.


테스트

function isObject(o) {
  return null != o && 
    typeof o === 'object' && 
    Object.prototype.toString.call(o) === '[object Object]';
}

function isDerivedObject(o) {
  return !isObject(o) && 
    null != o && 
    (typeof o === 'object' || typeof o === 'function') &&
    /^\[object /.test(Object.prototype.toString.call(o));
}

// TESTS

// is null an object?

console.log(
  'is null an object?', isObject(null)
);

console.log(
  'is null a derived object?', isDerivedObject(null)
);

// is 1234 an object?

console.log(
  'is 1234 an object?', isObject(1234)
);

console.log(
  'is 1234 a derived object?', isDerivedObject(1234)
);

// is new Number(1234) an object?

console.log(
  'is new Number(1234) an object?', isObject(new Number(1234))
);

console.log(
  'is new Number(1234) a derived object?', isDerivedObject(1234)
);

// is function object an object?

console.log(
  'is (new (function (){})) an object?', 
  isObject((new (function (){})))
);

console.log(
  'is (new (function (){})) a derived object?', 
  isObject((new (function (){})))
);

// is {} an object?

console.log(
  'is {} an object?', isObject({})
);

console.log(
  'is {} a derived object?', isDerivedObject({})
);

// is Array an object?

console.log(
  'is Array an object?',
  isObject([])
)

console.log(
  'is Array a derived object?',
  isDerivedObject([])
)

// is Date an object?

console.log(
  'is Date an object?', isObject(new Date())
);

console.log(
  'is Date a derived object?', isDerivedObject(new Date())
);

// is function an object?

console.log(
  'is function an object?', isObject(function(){})
);

console.log(
  'is function a derived object?', isDerivedObject(function(){})
);


13

prototypeobject전적으로에서 온 것인지 확인하려면 Object. 필터 밖으로 String, Number, Array, Arguments, 등

function isObject (n) {
  return Object.prototype.toString.call(n) === '[object Object]';
}

또는 단일 표현식 화살표 기능 (ES6 +)

const isObject = n => Object.prototype.toString.call(n) === '[object Object]'

1
이것이 가장 좋은 방법이지만 두 번째 줄로 더 쉽게 만들 수 있습니다.return Object.prototype.toString.call(n) === '[object Object]'
mesqueeb

1
다음 null과 같은 이유로 검사를 제거 할 수도 있습니다.Object.prototype.toString.call(null) === '[object Null]'
Gust van de Wal

12
var a = [1]
typeof a //"object"
a instanceof Object //true
a instanceof Array //true

var b ={a: 1}
b instanceof Object //true
b instanceof Array //false

var c = null
c instanceof Object //false
c instanceof Array //false

자세한 내용을 제공하라는 요청을 받았습니다. 변수가 객체인지 확인하는 가장 깨끗하고 이해하기 쉬운 방법은입니다 typeof myVar. 그것은 형식의 문자열을 반환합니다 (예를 들어 "object","undefined" ).

불행히도 Array와 null도 타입이 object있습니다. 실제 객체 만 가져 오려면 instanceof연산자를 사용하여 상속 체인을 확인해야합니다 . null을 제거하지만 Array에는 상속 체인에 Object가 있습니다.

따라서 해결책은 다음과 같습니다.

if (myVar instanceof Object && !(myVar instanceof Array)) {
  // code for objects
}

/./ instanceof Object //true
yckart

11

조금 늦게 ... "일반 객체"에 대해 (즉, { 'x': 5, 'y': 7}과 같은 의미) 나는이 작은 발췌 문장이 있습니다.

function isPlainObject(o) {
   return ((o === null) || Array.isArray(o) || typeof o == 'function') ?
           false
          :(typeof o == 'object');
}

다음 출력을 생성합니다.

console.debug(isPlainObject(isPlainObject)); //function, false
console.debug(isPlainObject({'x': 6, 'y': 16})); //literal object, true
console.debug(isPlainObject(5)); //number, false
console.debug(isPlainObject(undefined)); //undefined, false
console.debug(isPlainObject(null)); //null, false
console.debug(isPlainObject('a')); //string, false
console.debug(isPlainObject([])); //array?, false
console.debug(isPlainObject(true)); //bool, false
console.debug(isPlainObject(false)); //bool, false

그것은 항상 나를 위해 작동합니다. "o"유형이 "object"이지만 null 또는 배열 또는 함수가없는 경우에만 "true"를 반환합니다. :)


이전 답변에서 언급했듯이 Date 객체의 경우 접근 방식이 실패합니다.
Grzegorz Pawlik

9

lodash에는 isPlainObject 가 있습니다. 함수 나 배열을 주면 false를 반환합니다.


완전한! _.isObjectJS가 객체를 고려한 것과 일치하는 것을 알았습니다 . 그러나 일반적으로 필요한 것은 예를 들어 객체 리터럴과 배열을 구별하는 _.isPlainObject것입니다.
lime

9

작동합니다. true, false 또는 가능하면 null을 반환하는 함수입니다.

const isObject = obj => obj && obj.constructor && obj.constructor === Object;

console.log(isObject({})); // true
console.log(isObject([])); // false
console.log(isObject(new Function)); // false
console.log(isObject(new Number(123))); // false
console.log(isObject(null)); // null


2
@SeregPie 앞으로는 답변의 코드 편집을 자제해야합니다. 이 답변이 의미하는 것처럼 테스트 할 때 나는 null최종 테스트 결과가 아닌을 얻었습니다 false. 코드를 언제 수정해야합니까?를
Nick

9

이 문제를 올바르게 처리하는 방법에 대해 많은 혼동이 있기 때문에 2 센트를 남겨 두겠습니다 (이 답변은 사양을 준수하며 모든 상황에서 올바른 결과를 생성합니다).

프리미티브 테스트 : undefined null boolean string number

function isPrimitive(o){return typeof o!=='object'||null}

객체는 기본 요소가 아닙니다 :

function isObject(o){return !isPrimitive(o)}

또는 대안으로 :

function isObject(o){return o instanceof Object}
function isPrimitive(o){return !isObject(o)}

어레이 테스트 :

const isArray=(function(){
    const arrayTypes=Object.create(null);
    arrayTypes['Array']=true;
    arrayTypes['Int8Array']=true;
    arrayTypes['Uint8Array']=true;
    arrayTypes['Uint8ClampedArray']=true;
    arrayTypes['Int16Array']=true;
    arrayTypes['Uint16Array']=true;
    arrayTypes['Int32Array']=true;
    arrayTypes['Uint32Array']=true;
    arrayTypes['BigInt64Array']=true;
    arrayTypes['BigUint64Array']=true;
    arrayTypes['Float32Array']=true;
    arrayTypes['Float64Array']=true;
    return function(o){
        if (!o) return false;
        return !isPrimitive(o)&&!!arrayTypes[o.constructor.name];
    }
}());

다음을 제외한 객체 테스트 : Date RegExp Boolean Number String Function모든 배열

const isObjectStrict=(function(){
    const nativeTypes=Object.create(null);
    nativeTypes['Date']=true;
    nativeTypes['RegExp']=true;
    nativeTypes['Boolean']=true;
    nativeTypes['Number']=true;
    nativeTypes['String']=true;
    nativeTypes['Function']=true;
    return function(o){
        if (!o) return false;
        return !isPrimitive(o)&&!isArray(o)&&!nativeTypes[o.constructor.name];
    }
}());

8

다른 모든 것이 실패하면 이것을 사용합니다.

var isObject = function(item) {
   return item.constructor.name === "Object";
}; 

1
왜 문자열 비교, 왜 간단하지 item.constructor === Object않습니까?
K3 --- rnc

null예외 발생Uncaught TypeError: Cannot read property 'constructor' of null(…)
Vitim.us

@rounce 이전 IE 버전을 지원하려고하는데 왜 IE에서 작동하지 않습니까? 때문에 indexOf또는 때문에 constructor.name?
Jankapunkt

8

Ramda 기능 라이브러리는 자바 스크립트 유형을 검출하기위한 훌륭한 기능을 가지고 있습니다.

전체 기능을 해석 :

function type(val) {
  return val === null      ? 'Null'      :
         val === undefined ? 'Undefined' :
         Object.prototype.toString.call(val).slice(8, -1);
}

솔루션이 얼마나 단순하고 아름답다는 것을 깨달았을 때 나는 웃어야했다.

Ramda 문서의 사용법 예 :

R.type({}); //=> "Object"
R.type(1); //=> "Number"
R.type(false); //=> "Boolean"
R.type('s'); //=> "String"
R.type(null); //=> "Null"
R.type([]); //=> "Array"
R.type(/[A-z]/); //=> "RegExp"
R.type(() => {}); //=> "Function"
R.type(undefined); //=> "Undefined"

8

읽고 구현을 많이 시도 후, 나는 아주 소수의 사람들이 값 등을 확인하려고 것으로 나타났습니다 JSON, Math,document 1 단계보다 더 프로토 타입 체인 또는 객체.

typeof변수 를 확인한 다음 가장자리를 해킹 하는 대신 새로운 기본 요소 또는 기본 객체가 추가 될 때 리팩터링하지 않도록 확인을 가능한 한 간단하게 유지하는 것이 더 좋을 것이라고 생각했습니다.typeof '개체의 '.

결국 typeof운영자는 무언가 가 JavaScript에 대한 객체 인지 알려줄 것이지만, 객체에 대한 JavaScript의 정의는 대부분의 실제 시나리오 (예 :)에 비해 너무 광범위합니다 typeof null === 'object'. 다음은 v본질적으로 두 가지 검사를 반복하여 변수 가 객체 인지 여부를 결정하는 함수입니다 .

  1. 의 문자열 화 된 버전이 v이면 루프가 시작 됩니다 '[object Object]'.
    함수의 결과가 아래 로그와 정확히 같기를 원했기 때문에 이것이 유일한 "개체"기준입니다. 실패하면 함수는 즉시 false를 반환합니다.
  2. v로 체인의 다음 프로토 타입으로 대체 v = Object.getPrototypeOf(v)되지만 이후에도 직접 평가됩니다. 의 새로운 값이 v이면 루트 프로토 타입 ( 체인 내부의 유일한 프로토 타입 null일 수 있음)을 포함한 모든 프로토 타입 이 while 루프에서 검사를 통과하여 true를 반환 할 수 있음을 의미합니다. 그렇지 않으면 새로운 반복이 시작됩니다.

function isObj (v) {
  while (     Object.prototype.toString.call(v) === '[object Object]')
  if    ((v = Object.getPrototypeOf(v))         === null)
  return true
  return false
}

console.log('FALSE:')
console.log('[]                   -> ', isObj([]))
console.log('null                 -> ', isObj(null))
console.log('document             -> ', isObj(document))
console.log('JSON                 -> ', isObj(JSON))
console.log('function             -> ', isObj(function () {}))
console.log('new Date()           -> ', isObj(new Date()))
console.log('RegExp               -> ', isObj(/./))

console.log('TRUE:')
console.log('{}                   -> ', isObj({}))
console.log('new Object()         -> ', isObj(new Object()))
console.log('new Object(null)     -> ', isObj(new Object(null)))
console.log('new Object({})       -> ', isObj(new Object({foo: 'bar'})))
console.log('Object.prototype     -> ', isObj(Object.prototype))
console.log('Object.create(null)  -> ', isObj(Object.create(null)))
console.log('Object.create({})    -> ', isObj(Object.create({foo: 'bar'})))
console.log('deep inheritance     -> ', isObj(Object.create(Object.create({foo: 'bar'}))))


6
if(typeof value === 'object' && value.constructor === Object)
{
    console.log("This is an object");
}

1
경우 value이며 null,이 오류가 발생합니다 ...
게르 솜

그리고 물론 그것은 false목적을위한 것 Object.assign({}, {constructor: null})입니다.
user4642212

6

만약 명시 적으로 지정된 값이 있는지 확인하려면 {}.

function isObject (value) {
 return value && typeof value === 'object' && value.constructor === Object;
}

6
const isObject = function(obj) {
  const type = typeof obj;
  return type === 'function' || type === 'object' && !!obj;
};

!!objobj진실 인지 확인하기위한 속기 (필터링 null)


6

그것은 오래된 질문이지만 여기에 남겨 두는 것으로 생각되었습니다. 대부분의 사람들은 변수가 {}키-값 쌍을 의미 하는지 여부를 확인하고 있으며 JavaScript가 주어진 것을 위해 사용하는 밑줄 구조가 아닌 것을 확인하고 있습니다. 그래서 그것을 방해하지 마십시오. 당신이 할 경우 ...

let x = function() {}
typeof x === 'function' //true
x === Object(x) // true
x = []
x === Object(x) // true

// also
x = null
typeof null // 'object'

우리가 원하는 대부분의 시간은 API에서 자원 객체가 있는지 또는 ORM에서 리턴 된 데이터베이스 호출이 있는지를 아는 것입니다. 그런 다음 Array이 아닌지 null, 아닌지 , typeof 가 아닌지 테스트 할 수 있습니다 'function'.Object

// To account also for new Date() as @toddmo pointed out

x instanceof Object && x.constructor === Object

x = 'test' // false
x = 3 // false
x = 45.6 // false
x = undefiend // false
x = 'undefiend' // false
x = null // false
x = function(){} // false
x = [1, 2] // false
x = new Date() // false
x = {} // true

아빠 true를위한new Date()
toddmo

1
@toddmo 지적 해 주셔서 감사합니다. 이제 예제 코드는new Date()
Gilbert

4

내가 사용하고 싶은 것은 이것입니다

function isObject (obj) {
  return typeof(obj) == "object" 
        && !Array.isArray(obj) 
        && obj != null 
        && obj != ""
        && !(obj instanceof String)  }

나는 대부분의 경우 날짜가 객체로 검사를 통과해야한다고 생각하므로 날짜를 필터링하지 않습니다.


4

이 SO 질문에서 이런 종류의 유형 검사를 수행하는 "새로운"방법을 찾았습니다. 왜 일부 리터럴에 대해 instanceof가 false를 반환합니까?

그로부터 다음과 같이 유형 검사 기능을 만들었습니다.

function isVarTypeOf(_var, _type){
    try {
        return _var.constructor === _type;
    } catch(ex) {
        return false;         //fallback for null or undefined
    }
}

그럼 당신은 할 수 있습니다 :

console.log(isVarTypeOf('asdf', String));   // returns true
console.log(isVarTypeOf(new String('asdf'), String));   // returns true
console.log(isVarTypeOf(123, String));   // returns false
console.log(isVarTypeOf(123, Number));   // returns true
console.log(isVarTypeOf(new Date(), String));   // returns false
console.log(isVarTypeOf(new Date(), Number));   // returns false
console.log(isVarTypeOf(new Date(), Date));   // returns true
console.log(isVarTypeOf([], Object));   // returns false
console.log(isVarTypeOf([], Array));   // returns true
console.log(isVarTypeOf({}, Object));   // returns true
console.log(isVarTypeOf({}, Array));   // returns false
console.log(isVarTypeOf(null, Object));   // returns false
console.log(isVarTypeOf(undefined, Object));   // returns false
console.log(isVarTypeOf(false, Boolean));   // returns true

Chrome 56, Firefox 52, Microsoft Edge 38, Internet Explorer 11, Opera 43에서 테스트되었습니다.

편집 :
변수가 null인지 정의되지 않은 경우 확인하려면 대신 다음을 사용할 수 있습니다.

function isVarTypeOf(_var, _type){
    try {
        return _var.constructor === _type;
    } catch(ex) {
        return _var == _type;   //null and undefined are considered the same
        // or you can use === if you want to differentiate them
    }
}

var a = undefined, b = null;
console.log(isVarTypeOf(a, undefined)) // returns true
console.log(isVarTypeOf(b, undefined)) // returns true
console.log(isVarTypeOf(a, null)) // returns true

inanc의 의견에서 업데이트 : 챌린지 허용 : D

비교 객체를 풀려면 다음과 같이 시도하십시오.

function isVarTypeOf(_var, _type, looseCompare){
    if (!looseCompare){
        try {
            return _var.constructor === _type;
        } catch(ex){
            return _var == _type;
        }
    } else {
        try{
            switch(_var.constructor){
                case Number:
                case Function:
                case Boolean:
                case Symbol:
                case Date:
                case String:
                case RegExp:
                    // add all standard objects you want to differentiate here
                    return _var.constructor === _type;
                case Error:
                case EvalError:
                case RangeError:
                case ReferenceError:
                case SyntaxError:
                case TypeError:
                case URIError:
                    // all errors are considered the same when compared to generic Error
                    return (_type === Error ? Error : _var.constructor) === _type;
                case Array:
                case Int8Array:
                case Uint8Array:
                case Uint8ClampedArray:
                case Int16Array:
                case Uint16Array:
                case Int32Array:
                case Uint32Array:
                case Float32Array:
                case Float64Array:
                    // all types of array are considered the same when compared to generic Array
                    return (_type === Array ? Array : _var.constructor) === _type;
                case Object:
                default:
                    // the remaining are considered as custom class/object, so treat it as object when compared to generic Object
                    return (_type === Object ? Object : _var.constructor) === _type;
            }
        } catch(ex){
            return _var == _type;   //null and undefined are considered the same
            // or you can use === if you want to differentiate them
        }
    }
}

그런 식으로, 당신은 inanc의 의견처럼 할 수 있습니다 :

isVarTypeOf(new (function Foo(){}), Object); // returns false
isVarTypeOf(new (function Foo(){}), Object, true); // returns true

또는

Foo = function(){};
Bar = function(){};
isVarTypeOf(new Foo(), Object);   // returns false
isVarTypeOf(new Foo(), Object, true);   // returns true
isVarTypeOf(new Bar(), Foo, true);   // returns false
isVarTypeOf(new Bar(), Bar, true);   // returns true
isVarTypeOf(new Bar(), Bar);    // returns true

새 클래스가 객체인지 여부를 감지 할 수 없습니다. isVarTypeOf (new (function Foo () {}), Object) // true 대신 false를 반환합니다. 적절한 점검을 위해 아래 답변을 참조하십시오.
Inanc Gumus

그러나 instanceof개체를 확인 하는 데 사용할 수 있습니다 . 그러나 이것은 정확한 과학이 아닙니다.
Inanc Gumus

@inanc, 또한 그 때문이다 new Foo()리턴한다 Foo객체와 동일한 new String()리턴한다 String객체 또는 new Date()리턴한다 Date객체가, 당신이 할 수있는 Foo = function(){}; isVarTypeOf(new Foo(), Foo);
am05mhz을

그래, 그것이 내가 실제로 말하는 것입니다. 당신은 그것이 현재 물체인지 여부를 확인하고 있지 않습니다.
Inanc Gumus

@inanc 건배, 나는이 페이지와 다른 페이지에 도착 유형 검사 (단지 객체)를 할 수있는 방법을 찾고 있었다, 나는 너무 내가이 질문의 맥락, 나의 나쁜 :) 잊었 흥분
am05mhz
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.