JavaScript에서 값이 객체인지 어떻게 확인합니까?
JavaScript에서 값이 객체인지 어떻게 확인합니까?
답변:
업데이트 :
이 답변은 불완전하며 잘못된 결과를 제공합니다 . 예를 들어, 몇 가지 다른 경우는 말할 것도없고 JavaScript null
의 유형 object
으로 간주됩니다 . 아래 권장 사항을 따르고 다른 "가장 올 바르고 올바른 답변" 으로 넘어갑니다 .
원래 답변 :
typeof(var)
및 / 또는을 사용해보십시오 var instanceof something
.
편집 :이 답변은 변수의 속성을 검사하는 방법에 대한 아이디어를 제공하지만 객체가 아닌지 확인하는 방탄 레시피 는 아닙니다 (결국 레시피가 전혀 없습니다!). 사람들은 아무 연구도하지 않고 여기에서 복사 할 무언가를 찾는 경향이 있기 때문에, 가장 반대의 답변을하고 다른 답변을 찾는 것이 좋습니다.
typeof
연산자이므로을 (를) 필요로하지 않습니다 ()
.
typeof
null이 아닌 경우 'object'를 반환합니다.이 값은 객체 instanceof
가 아니며를 사용하여 만든 객체에는 작동하지 않습니다 Object.create(null)
.
인 경우 typeof yourVariable === 'object'
객체이거나 null입니다. null을 제외하려면 그냥 만드십시오 typeof yourVariable === 'object' && yourVariable !== null
.
yourVariable !== null
더 나은 연습이 될까요?
typeof 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.
Object.prototype.toString.call(yourVar)
되고, yourVar을 당신이 검사 할 필요. 배열의 경우 Object.prototype.toString.call([1,2])
반환[object Array]
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.getPrototypeOf
를 throw하는 사용 하는 것입니다.
// 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({})
obj === Object(obj)
true
배열을 반환 합니다.
var x = []; console.log(x === Object(x)); // return true
getPrototypeOf
예를 들어, 객체이지만 던져지는 취소 된 프록시에서는 작동하지 않습니다.
({}).toString.apply(obj) === '[object Object]'
이것이 배열이 아닌 배열과 객체를 구별 하지 않는 이유
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;
};
return obj === Object(obj) && Object.prototype.toString.call(obj) !== '[object Array]'
null
. 허용되는 답변이어야합니다.
Object.prototype.toString.call(myVar)
돌아올 것이다 :
"[object Object]"
myVar가 객체 인 경우"[object Array]"
myVar가 배열 인 경우이에 대한 자세한 내용과 typeof를 대체 할 수있는 좋은 이유는 이 기사를 확인하십시오 .
typeof [] === 'object'
-> true
. 이것이이 방법이 필요한 것입니다.
Object.prototype.toString.call(3)
-> "[object Number]"
. Object.prototype.toString.call(new Number(3))
-> "[object Number]
"
getType=function(obj){return Object.prototype.toString.call(obj).match(/\[object (\w+)\]/)[1];};
추가 함수 호출 (속도)없이 객체 또는 배열을 간단히 확인하십시오. 또한 여기에 게시 되었습니다 .
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
{
문자로 시작하는 것으로 표현됩니까 ? 배열의 경우 IE <9를 지원할 필요가없는 한 Array.isArray()
무언가가 배열인지 확인 하는 데 사용할 수 있습니다 . 제공 한 모든 테스트 사례를 통과합니다.
나는 단순히 좋아한다 :
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
new Date()
객체를 반환하기 때문입니다. JavaScript는 객체를 처리하고보고하지만 배열은 객체가 아닌 논리적 관점에서 나온 것입니다. 그러나 실제로는 동일하지 않으므로 동일하게 보는 것이 도움이되지 않습니다. length
예를 들어 객체에는 속성이 없으며 push ()와 같은 메서드가 없습니다. 그리고 때로는 다른 매개 변수가 주어진 매개 변수에 의존하는 경우 배열이나 객체간에 차이를 만들어야하는 함수 과부하 매개 변수를 제공 할 수 있습니다.
length
처럼 재산이나 방법을 push
, Object.create(Array.prototype)
다음이있는 배열이 아닌 객체의 사소한 반례입니다. 배열을 특별하게 만드는 것은 사용자 정의 [[DefineOwnProperty]] 필수 내부 메소드가있는 이국적인 오브젝트이지만 여전히 오브젝트라는 것입니다.
length
속성을 가질 수 없다고 썼다 ( length
기본적으로 객체 리터럴에는 속성 이 없음을 의미 함 ). 나는 배열이 논리적 관점 에서 객체가 아니라고 썼다 . 프로그램 논리에 대해 이야기하고 있습니다. 배열이 "실제"배열이고 "실제"객체가 아닌지 확인해야하는 경우가 있습니다. 그게 다야 Array.isArray()
. 객체 또는 객체의 배열을 받아들이는 함수가 있다고 상상해보십시오. 특별한 속성이나 메소드를 확인하는 것은 더러운 해결책입니다. 기본 방식은 항상 좋습니다.
typeof null
있다 "object"
, 없다 "undefined"
.
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';
}
앞에서 언급 한 모든 테스트 사례에서 올바르게 작동하지는 않지만 모든 객체 (일반 또는 생성)에는 충분합니다.
isObject
Object.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 에 이미 패키지 가 생성 되었습니다 ! 그리고 이전에 설명한 모든 테스트 사례에서 작동합니다! 🙂
isDate
강력한 코드를 작성 하기 위해 yourDateObject 에 사용해야 한다는 것 isObject
입니다. 그렇지 않으면 취성이있는 방법이 있습니다.
Date
예, 대답이 토론하기 때문에 내 의견에 사용 하는 것은 잘못 선택되었습니다 Date
. 그러나 Date
무한한 클래스 중 하나 일뿐 아니라 다른 클래스에도 적용됩니다. 예 :를 class Foo() { }; var x = new Foo(); isObject(x)
반환합니다 false
. OP의 유스 케이스가 무엇인지 정확히 알지 못하지만 가능한 모든 클래스 에 대해 알아야하고 각 클래스 에 대해 구체적으로 점검 하는 것은 불가능한 시나리오를 쉽게 생각할 수 있습니다.
세상에! 나는 이것이 이전보다 더 짧을 수 있다고 생각한다.
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
함수 또는 "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 에서 작동하지 않을 수 있습니다
Object.create(null)
그리고 왜 그렇게 할 것입니까?
자, 질문에 대답하기 전에 먼저이 개념을 알려 드리겠습니다. 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);
"객체"란 무엇을 의미하는지에 달려 있습니다. 프리미티브 가 아닌 모든 것, 즉 새로운 속성을 설정할 수 있는 모든 것을 원한다면 트릭을 수행해야합니다.
function isAnyObject(value) {
return value != null && (typeof value === 'object' || typeof value === 'function');
}
이 프리미티브를 제외 (일반 번호 / NaN
/ Infinity
일반 문자열, 문자, true
/ false
, undefined
과 null
)하지만 다른 모든 것들 (포함에 true를 돌려 Number
, Boolean
및 String
객체). 참고 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에있는 것의 정의를 더 흐리게합니다.
instanceof Object
. 두 개의 동일한 함수 리터럴이 엄격하게 같지 않고 참조로 전달됩니다.
하나님, 다른 답변에 너무 혼란.
짧은 답변
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를 확인하는 방법을 이미 배웠을 것입니다.
false
때 (원하는대로) 반환 anyVar
합니다.
값의 유형을 확인하는 가장 합리적인 방법은 typeof
연산자입니다. 유일한 문제는 그것이 끔찍하게 고장났다는 것입니다.
"object"
대한 반환null
널 유형에 속한."function"
객체 유형에 속하는 호출 가능한 객체를 합니다."unknown"
. 금지 된 결과는 "function"
기본 형식입니다.typeof
null
프리미티브 가 아닌 경우에만 신뢰할 수 있습니다. 따라서 값이 객체인지 확인하는 방법은 반환 된 문자열 typeof
이 프리미티브에 해당하지 않고 객체가 아닌지 확인하는 것입니다null
입니다. 그러나 문제는 미래의 표준이 새로운 기본 유형을 도입 할 수 있으며 코드에서 객체로 간주한다는 것입니다. 새로운 유형은 자주 나타나지 않지만 ECMAScript 6과 같이 Symbol 유형이 도입되었습니다.
따라서 대신 typeof
값이 객체인지 여부에 따라 결과가 다른 접근법 만 권장합니다. 다음은
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.create
와 Object.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
직접 액세스하지 않고 참조 만합니다.
이 시도
if (objectName instanceof Object == false) {
alert('Not an object');
}
else {
alert('An object');
}
Object.prototype instanceof Object
.-> false. Object.create(null) instanceof Object
-> 거짓.
new Date() instanceof Object
=> 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));
}
// 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
, Date
와 function
의 모든 개체입니다. null
그럼에도 불구하고 약간의 노력이 필요합니다. 따라서 null
null이 아닌 것을 감지 하려면 첫 번째 를 확인하는 것이 좋습니다 .
typeof o === 'object'
그것이 o
객체인지 보증 확인 . 이 검사하지 않고, Object.prototype.toString
심지어 위해, 모든게에 대한 객체를 반환하기 때문에, 의미가 될 것 undefined
와 null
! 예를 들어, 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(){})
);
prototype
의 object
전적으로에서 온 것인지 확인하려면 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]'
return Object.prototype.toString.call(n) === '[object Object]'
null
과 같은 이유로 검사를 제거 할 수도 있습니다.Object.prototype.toString.call(null) === '[object Null]'
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
조금 늦게 ... "일반 객체"에 대해 (즉, { '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"를 반환합니다. :)
lodash에는 isPlainObject 가 있습니다. 함수 나 배열을 주면 false를 반환합니다.
_.isObject
JS가 객체를 고려한 것과 일치하는 것을 알았습니다 . 그러나 일반적으로 필요한 것은 예를 들어 객체 리터럴과 배열을 구별하는 _.isPlainObject
것입니다.
작동합니다. 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
null
최종 테스트 결과가 아닌을 얻었습니다 false
. 코드를 언제 수정해야합니까?를
이 문제를 올바르게 처리하는 방법에 대해 많은 혼동이 있기 때문에 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];
}
}());
다른 모든 것이 실패하면 이것을 사용합니다.
var isObject = function(item) {
return item.constructor.name === "Object";
};
item.constructor === Object
않습니까?
null
예외 발생Uncaught TypeError: Cannot read property 'constructor' of null(…)
indexOf
또는 때문에 constructor.name
?
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"
읽고 구현을 많이 시도 후, 나는 아주 소수의 사람들이 값 등을 확인하려고 것으로 나타났습니다 JSON
, Math
,document
1 단계보다 더 프로토 타입 체인 또는 객체.
typeof
변수 를 확인한 다음 가장자리를 해킹 하는 대신 새로운 기본 요소 또는 기본 객체가 추가 될 때 리팩터링하지 않도록 확인을 가능한 한 간단하게 유지하는 것이 더 좋을 것이라고 생각했습니다.typeof
'개체의 '.
결국 typeof
운영자는 무언가 가 JavaScript에 대한 객체 인지 알려줄 것이지만, 객체에 대한 JavaScript의 정의는 대부분의 실제 시나리오 (예 :)에 비해 너무 광범위합니다 typeof null === 'object'
. 다음은 v
본질적으로 두 가지 검사를 반복하여 변수 가 객체 인지 여부를 결정하는 함수입니다 .
v
이면 루프가 시작 됩니다 '[object Object]'
. 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'}))))
if(typeof value === 'object' && value.constructor === Object)
{
console.log("This is an object");
}
value
이며 null
,이 오류가 발생합니다 ...
false
목적을위한 것 Object.assign({}, {constructor: null})
입니다.
그것은 오래된 질문이지만 여기에 남겨 두는 것으로 생각되었습니다. 대부분의 사람들은 변수가 {}
키-값 쌍을 의미 하는지 여부를 확인하고 있으며 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()
new Date()
이 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
instanceof
개체를 확인 하는 데 사용할 수 있습니다 . 그러나 이것은 정확한 과학이 아닙니다.
new Foo()
리턴한다 Foo
객체와 동일한 new String()
리턴한다 String
객체 또는 new Date()
리턴한다 Date
객체가, 당신이 할 수있는 Foo = function(){}; isVarTypeOf(new Foo(), Foo);
도
null
객체 인지 여부 ).