자바스크립트에서 배열 유형을 감지하는 데 어떤 방법이 사용됩니까?

伊谢尔伦
풀어 주다: 2017-07-18 13:19:49
원래의
1052명이 탐색했습니다.

연산자 유형.

함수, 문자열, 숫자 및 정의되지 않은 유형의 객체에는 문제가 없지만 배열 객체에는 사용되지 않습니다.

alert(typeof null); // "object" 
alert(typeof []); // "object"
로그인 후 복사

instanceof

전역 실행이 하나만 있는 경우 이는 다음에 적용됩니다. 환경에 여러 프레임이 포함되어 있는 경우 배열 생성자의 서로 다른 버전이 두 개 이상 있습니다. 배열이 한 프레임에서 다른 프레임으로 전달되면 전달된 배열은 두 번째 프레임에서 기본적으로 생성된 배열과 동일한 특성을 갖게 됩니다. . 생성자가 다르면 유형도 다릅니다


if (value instanceof Array) {
  //对数组执行某项操作   
}
로그인 후 복사

Array.isArray() 메서드

ES5에 처음 도입되었기 때문에 IE9+, Firefox 4+, Safari 5+, Opera 10.5+ 및 Chrome만 지원합니다


if (Array.isArray(value)) {
  //对数组执行某些操作 
}
로그인 후 복사

Object.prototype.toString.call() 메소드

모든 환경에 적용 가능하며, Object의 toString() 메소드는 네이티브가 아닌 생성자의 생성자 이름을 감지할 수 없습니다. 개발자가 사용자 정의한 모든 생성자는 [객체 Object]를 반환합니다.

원리: 모든 값에 대해 Object의 기본 toString() 메서드를 직접 호출하면 각 클래스 내에서 사용할 수 있는 [object NativeConstrctorName] 형식의 문자열이 반환됩니다. 위 문자열에서 생성자의 이름을 지정하는 속성입니다.


var value = []
console.log(Object.prototype.toString.call(value))//"[Object Array]"
로그인 후 복사

네이티브 배열의 생성자 이름은 범위와 관련이 없으므로 toString() 메서드를 사용하면 동일한 값이 출력되도록 할 수 있습니다.

  객체 고유의 toString() 메서드를 사용하는 것은 어떨까요?


var value = []
console.log(value.toString())//" "
value = ['pp','oo']
console.log(value.toString())//"pp,oo"
value = ['pp',"oo"]
console.log(Object.prototype.toString.call(value))//[object Array]
로그인 후 복사

 Array의 tostring() 메서드가 재정의되었으므로(많은 기본 개체에 해당) 자체 생성자에서 toString() 메서드를 호출하고 다른 문자열을 반환합니다.

 이것을 사용할 수도 있습니다 method 네이티브 함수인지 정규 표현식인지 확인하려면


function isFunction(value){
    return Object.prototype.toString.call(value) === “[object Function]”
}//不适用于IE中以COM对象实现的任何函数
function isRegExp(value){
    return Object.prototype.toString.call(value) === “[object RegExp]”
}
로그인 후 복사

객체의 생성자 속성

instanceof 외에도 각 객체의 생성자 속성을 사용하여 해당 유형을 결정할 수도 있습니다. 우리는 이것을 할 수 있습니다:

var arr = []; 
alert(arr.constructor == Array); // true
로그인 후 복사

마지막 두 솔루션은 흠잡을 데 없는 것 같지만, 정말 그럴까요? 예상치 못한 상황이 발생하고 여러 프레임 사이를 왔다 갔다 하면 실망스러운 문제가 발생합니다.

var iframe = document.createElement('iframe'); 
document.body.appendChild(iframe); 
xArray = window.frames[window.frames.length-1].Array; 
var arr = new xArray(1,2,3); // [1,2,3] 
// 哎呀! 
arr instanceof Array; // false 
// 哎呀呀! 
arr.constructor === Array; // false
로그인 후 복사

각 iframe에는 고유한 실행 환경 세트가 있으므로 프레임 간에 인스턴스화된 객체는 서로 공유되지 않으므로 프로토타입 체인이 발생합니다. 위의 감지 코드는 실패합니다! 어떻게 해야 하나요? ? 글쎄요, JavaScript는 동적 언어입니다. 어쩌면 뱀기름 "오리 유형"이 우리에게 도움이 될 수 있습니다. 이 메소드는 Prototype 프레임워크와 같은 일부 사람들에 의해 사용되었습니다. 이 메소드가 구현하는 Object.isArray 메소드를 살펴보겠습니다.

위 내용은 자바스크립트에서 배열 유형을 감지하는 데 어떤 방법이 사용됩니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿