저는 오늘 우연히 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; 🎜>}