>웹 프론트엔드 >JS 튜토리얼 >배열인지 확인하는 js 함수: isArray()_javascript 기술

배열인지 확인하는 js 함수: isArray()_javascript 기술

WBOY
WBOY원래의
2016-05-16 18:00:031140검색

저는 오늘 우연히 Alipay JS 프레임워크 base.js를 배우고 있었습니다. 살펴보니 구현은 이렇습니다.

코드 복사 코드는 다음과 같습니다.

if (배열 인스턴스 값 ||
(!(객체 값 인스턴스) &&
(Object.prototype.toString.call((값)) == '[객체 배열]') ||
값 유형 길이 = = '번호' &&
값 유형 스플라이스 != '정의되지 않음' &&
값 유형 유형.propertyIsEnumerable != '정의되지 않음' &&
!value.propertyIsEnumerable('splice')) ) {
return '배열';
}

어떻게 표현해야 할까요? 물론, "역사상 가장 완전한 것"이라고 할 수도 있습니다. 가장 주류적인 방법을 사용하지만, 단지 그것들을 모두 함께 쓸 뿐입니다.


아시다시피, 인스턴스 오브와 생성자를 사용하는 것이 가장 직접적이고 간단한 방법입니다.
코드 복사 코드는 다음과 같습니다.

var arr = [];
arr instanceof Array; // true
arr.constructor == Array; >
하지만
다른 iframe에서 생성된 배열은 프로토타입을 공유하지 않기 때문입니다

. 이렇게 사용한다면. 문제가 시작됩니다. 따라서 프레임워크에 적용하려는 경우 이 방법은 절대 작동하지 않습니다. 반대로 이 문제는 Douglas Crockford의 크래밍 방법("JavaScript Language Essence" P61)을 사용하여 해결할 수 있습니다.

var is_array = function(value) {
return value &&
typeof value === 'object' &&
typeof value.length === ' number' &&
typeof value.splice === 'function' &&
!(value.propertyIsEnumerable('length'))
}; 그런데


있나요? 더 이상 쉬운 방법은 어떻습니까? 사실 우리가 직접 사용하는 것과 똑같지 않나요?


코드 복사 코드는 다음과 같습니다.Object.prototype.toString.call(value) == '[객체 배열]'
위 작성 방법은 jQuery에서 사용하는 방법입니다. 현재 타오바오의 키시(Kissy)도 이 방식을 사용하고 있다. 이것이 현재 가장 간단하고 효과적인 방법이 아닌가? 개인적으로는 내부 프레임워크를 작성하기가 좀 번거롭다고 생각합니다. 루틴 요약, 최종 해결 방법:


var isArray = function( obj) {
return Object.prototype.toString.call(obj) === '[객체 배열]'
}
=============


업데이트: 2010.12.31 00:01 (출처)

타입 판단하세요, 멋져요. 구체적으로는 위와 같습니다.


코드를 복사하세요 코드는 다음과 같습니다.
var is = function (obj,type) {
return (type === "Null" && obj === null) ||
(type === "Undefine" && obj === void 0 ) ||
(type === "Number" && isFinite(obj)) ||
Object.prototype.toString.call(obj).slice(8,-1) === type; 🎜>}


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.