JS에서 객체의 유형 검사는를 통해 수행됩니다 instanceof.
obj instanceof Array
각 프레임에 자체 Array개체 가 있기 때문에 개체가 프레임 경계를 넘어 전달되는 경우에는 작동하지 않습니다 . 개체 의 내부 [[Class]] 속성을 확인하여이 문제를 해결할 수 있습니다 . 그것을 얻으려면 다음을 사용하십시오 Object.prototype.toString()(ECMA-262에서 작동하는 것이 보장됩니다) :
Object.prototype.toString.call(obj) === '[object Array]'
두 방법 모두 실제 배열에 대해서만 작동하며 arguments객체 또는 노드 목록 과 같은 배열과 유사한 객체가 아닙니다 . 모든 배열과 같은 객체에는 숫자 length속성 이 있어야 하므로 다음과 같이 확인합니다.
typeof obj !== 'undefined' && obj !== null && typeof obj.length === 'number'
문자열은이 검사를 통과하므로 IE가 인덱스로 문자열의 문자에 액세스하는 것을 허용하지 않기 때문에 문제가 발생할 수 있습니다. 따라서, 당신은 변경할 수 있습니다 typeof obj !== 'undefined'하는 typeof obj === 'object'구별 유형 프리미티브 및 호스트 개체를 제외 할 'object'alltogether을. 이것은 여전히 문자열 객체를 통과시킬 수 있으며, 수동으로 제외해야합니다.
대부분의 경우 실제로 알고 싶은 것은 숫자 인덱스를 통해 객체를 반복 할 수 있는지 여부입니다. 따라서 객체에 0대신 이름이 지정된 속성이 있는지 확인하는 것이 좋습니다 . 다음 검사 중 하나를 통해 수행 할 수 있습니다.
typeof obj[0] !== 'undefined' // false negative for `obj[0] = undefined`
obj.hasOwnProperty('0') // exclude array-likes with inherited entries
'0' in Object(obj) // include array-likes with inherited entries
객체로의 캐스트는 배열과 같은 기본 요소 (예 : 문자열)에 대해 올바르게 작동하는 데 필요합니다.
다음은 JS 배열에 대한 강력한 검사를위한 코드입니다.
function isArray(obj) {
return Object.prototype.toString.call(obj) === '[object Array]';
}
그리고 반복 가능한 (비어 있지 않은) 배열과 같은 객체 :
function isNonEmptyArrayLike(obj) {
try { // don't bother with `typeof` - just access `length` and `catch`
return obj.length > 0 && '0' in Object(obj);
}
catch(e) {
return false;
}
}