수조를 검출하는 일반적인 방법과 고급 방법

체크 배열


instanceof


어떤 대상이 수조인지 아닌지를 판단하면 웹 페이지나 전역 역할 영역에 대해 instanceof 조작부호를 사용하면 만족스러운 결과를 얻을 수 있다.
if(value instanceof Array){// }

//instanceof 
function instanceOf(left,right) {
    // 
    let prototype = right.prototype
    // 
    left = left.__proto__
    // 
    while (true){
        if(left == null){
            return false
        }
        if(prototype === left){
            return true
        }
        left = left.__proto__
    }
}
instanceof 조작부호의 문제는 전체적인 실행 환경만 있다고 가정하는 데 있다.만약에 웹 페이지에 여러 개의 프레임워크(한 페이지에 여러 개의 프레임이 포함)가 포함된다면 실제로는 두 개 이상의 전역 실행 환경이 존재하고 두 개 이상의 서로 다른 버전Array의 구조 함수(Array window 가 존재한다.만약 한 프레임워크에서 다른 프레임워크로 하나의 그룹을 전송한다면, 전송된 그룹과 두 번째 프레임워크에서 원생적으로 만들어진 그룹은 각각 다른 구조 함수를 가지고 있다.

Array.isArray()


ES5는 이 문제를 해결하기 위해 Array.isArray() 방법을 새로 추가했습니다.이 방법의 목적은 어떤 값이 수조인지 아닌지를 최종적으로 확인하는 것이다. 그것이 어느 전역 실행 환경에서 만들어졌든지 상관없다.사용법은 다음과 같습니다.
if(Array.isArray(value)){// }

모든 값에서 Object 기본 toString() 방법을 호출하면 [object Native ConstructorName] 형식의 문자열이 반환됩니다.모든 클래스는 내부에 [[[Class]] 속성이 있는데 이 속성은 상기 문자열의 구조 함수 이름을 지정한다.예:
alert(Object.prototype.toString.call(value));
//“[object Array]”

원본 배열의 구조 함수 이름은 전역 역할 영역과 무관하기 때문에 toSting()을 사용하면 일치된 값을 되돌릴 수 있습니다.이를 통해 다음과 같은 함수를 생성할 수 있습니다.
function isArray(value){
    return Object.prototype.toString.call(value)=="[object Array]";
}

마찬가지로 이 사고방식을 바탕으로 어떤 값이 원생 함수나 정규 표현식인지 테스트할 수 있다.

좋은 웹페이지 즐겨찾기