연산자 유형.
함수, 문자열, 숫자 및 정의되지 않은 유형의 객체에는 문제가 없지만 배열 객체에는 사용되지 않습니다.
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!