2012-09-06 3 views
0

좋아 여기 공상, 그래서 아무것도, 그냥 JSON :주어진 객체가 배열인지 객체인지를 어떻게 알 수 있습니까?

var a = ["foo", "bar", "baz"]; 

var o = {a: "foo", b: "bar", c: "baz"}; 

그러나 우리는이 작업을 수행 할 때 어떻게됩니까?

typeof a; // => "object" 

"배열"이라고 말하도록 설정할 수 있다면 좋겠다. 그러나 나는 할 수 없다. 차별화 할 방법이 있습니까?

+0

배열에 숫자가 아닌 값을 추가하면이 값이 연관 (개체)이됩니다. – jeremy

+1

@Nile - 아니요. JavaScript에는 "연관 배열"이라는 것이 없습니다. 숫자가 아닌 값을 배열에 추가하는 것은 특별한 일이 아닙니다. 숫자가 아닌 속성을 배열에 추가하는 것은 (대개) 모범 사례는 아니지만 객체로 만들지는 못합니다 (이미 객체이기 때문에). – Quentin

+0

@Quentin hm, 알겠습니다. – jeremy

답변

1

당신은 확인할 수 있습니다. 그것은 유스 케이스에 달려있다.

예를 들어, 당신이 JSON 개체에서 할 수있는 일이 아니다 배열에있는 항목을 계산하려는 경우, 당신은 시도 할 수 있습니다 :

if (typeof(obj.length) !=="undefined"){ //do whatever} 

이 당신에게베이스 옵션을 제공합니다 어떤 경우에는 덜 관련성이있는 실제 클래스가 아닌 객체 속성에 대한 코드.

3

instanceof operator을 사용하십시오.

if (a instanceof Array) 

그래서 배열하고 Array 생성자에 비교해야하지 않은 배열을 구별하는 (개체 배열의 프로토 타입 체인에로) 모든 배열은 객체 있다는 사실을 양지해야합니다, 당신은 사용할 수 없습니다 이에 대한 Object 생성자.

2
를 사용하여 멀티 window 환경에없는 경우, 당신은 생성자를 확인할 수 있습니다

...

var isArray = possiblyAnArray.constructor == Array; 

... 또는 instanceof를 사용하여 ...

var isArray = possiblyAnArray instanceof Array; 

이 '수상 다른 창에서 Array 생성자가 다른 참조를 보유하므로 다중 window 환경에서 작업하지 마십시오. 이 경우에는

var isArray = ({}).toString.call(possiblyAnArray) == "[object Array]"; 

... 그것을 느린 방법을해야 할 것 I는 구현하기 매우 간단하지만, 전혀 엄격하게 Array 무엇이 당신에게 보장은없는, 너무 다른 방법을 보았다 아닙니다.

Array.prototype.isArray = true; 
var isArray = [].isArray; 

사용하는 것은 좋지 않지만 어떻게 작동되는지는 흥미 롭습니다. 오리 타이핑을 사용하는 것입니다

var isArray = a instanceof Array; 
+0

우 ~, 다중 창 환경으로는 무엇이 있을까요? – wwaawaw

+0

@adlwalrus'iframe은 좋은 예입니다. 드문 일이지만 보편적 인 유틸리티 함수를 작성하는 경우에는 후자를 사용할 가치가 있습니다 (그렇지 않은 경우 교차 '윈도우'가 작동하지 않는다는 것을 문서화해야합니다). – alex

0

또 다른 방법 : 개체가 Array의 인스턴스 인 경우

+0

* JSON Object *, 설명해 주시겠습니까? – alex

+0

그냥 object {} 또는 Object입니다. 밑줄 구현은 일반 키 값 맵입니다. –

0

방금 ​​발견했습니다. 문제가 있습니까?

var a = [4,5,6,7]; 
if(typeof a === object) a.type = "object"; 
if(a.__proto__ === Array.prototype) a.type = "array"; 
+0

예,'__proto__'는 비표준이며 IE에서는 전혀 지원되지 않습니다. – alex

+0

정말요? 어떻게 그렇게 널리 사용/지원됩니까? 표준이되는 도중에 있습니까? – wwaawaw

+0

아니요, 표준은 ['getPrototypeOf()'] (https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/GetPrototypeOf)입니다. 파이어 폭스가 그것을 구현하고 다른 브라우저가 그것을 복사했기 때문에 광범위하게 지원된다. 훌륭한 브라우저 지원을 제공하는 다른 방법이 언제 있는지 확인하는 것도 좋은 방법이 아닙니다. – alex

관련 문제