오늘은 에디터가 변수가 배열(Array)인지 판단하기 위해 자바스크립트 관련 지식을 정리해보겠습니다. 구체적인 내용은 다음과 같습니다.
1. typeof가 그렇게 강력한가요? ?
//首先看代码 var ary = [1,23,4]; console.log(typeof ary); //输出结果是Object
위 방법은 배열인지 여부를 실시간으로 감지할 수 없고 유형만 판단할 수 있습니다. 따라서 typeof는 기본 유형 데이터를 판단하는 데는 좋지만 배열인지 여부(구체적인 사용법)를 정확하게 테스트할 수는 없습니다. typeof는 나중에 언급될 것입니다) , 이제 주제로 돌아갑니다)
2.판결사례
var ary = [1,23,4]; console.log(ary instanceof Array)//true;
출력 효과로 볼 때, 데이터 유형이 배열인지 정확하게 감지할 수 있습니다. 이 방법의 단점을 먼저 생각해 보겠습니다.
3. 프로토타입 체인 방식
var ary = [1,23,4]; console.log(ary.__proto__.constructor==Array);//true console.log(ary.constructor==Array)//true 这两段代码是一样的
이 방법이 너무 정교하네요~~ 프로토타입 체인 방법을 사용하는데 호환이 됩니다. IE 초기 버전에서는 __proto__가 정의되어 있지 않습니다~ 게다가 여전히 한계가 있으니 이제 두 번째와 세 번째의 한계를 요약해 보겠습니다. 방법
두 번째, 세 번째 방법의 한계를 정리
instanceof와 생성자로 판단되는 변수는 현재 페이지에서 선언되어야 합니다. 예를 들어 페이지(상위 페이지)에는 프레임이 있고, 페이지(하위 페이지)는 프레임에서 참조되며, ary는 선언됩니다. 하위 페이지를 상위 페이지의 변수에 할당한 다음 변수를 판단하면 Array == object.constructor가 false를 반환합니다.
이유:
1. 배열은 참조 데이터이며 전송 과정에서는 참조 주소만 전송됩니다.2. 각 페이지의 Array 네이티브 객체가 참조하는 주소는 다릅니다. 하위 페이지에 선언된 배열의 해당 생성자는 하위 페이지의 Array 객체를 판단하고 사용합니다. 배열 하위 페이지 배열과 동일하지 않습니다. 그렇지 않으면 문제를 추적하기가 어렵습니다.
4. 일반적인 방법
var ary = [1,23,4]; function isArray(o){ return Object.prototype.toString.call(o)=='[object Array]'; } console.log(isArray(ary));