1. 먼저 5 가지 원본 유형을 소개합니다
JavaScript의 5 개의 원시 유형은 문자열 , 숫자 , 부울 , 정의되지 않은 , null입니다.
var name = "jack"; var age = 32; var single = false; var app; //undefinedConsole.log(typeof name); //stringConsole.log(Typeof age); //numberconsole.log(Typeof Single); //booleanconsole.log(typeof app); //undefinedConsole.log(typeof null); //물체
NULL을 제외한 다른 4 가지 기본 유형은 Typeof 에 의해 식별 될 수 있음이 밝혀졌습니다.
if (typeof name === "string") {name += "zhang"; } if (typeof age === "number") {age ++; } if (단일 타입 === "boolean"&& single) {…} if (typeof app === "undefined") {app = {}; }NULL 유형이 객체를 얻을 수 있으므로 사용 === NULL을 직접 감지합니다.
if (el === null) {…}2. 객체
JavaScript 객체에는 내장 객체 ( 날짜, RegexP, 오류 등) 및 사용자 정의 객체가 포함됩니다.
(기능과 배열도 내장 객체이지만 다음 섹션에서 별도로 설명합니다).
감지 된 결과는 모두 객체 이기 때문에 기본 유형과 같은 유형을 사용하여 객체를 감지 할 수 없습니다.
Console.log (새 날짜 타입 ()); //objectConsole.log(typeof new regexp ()); //objectConsole.log(typeof new Error ()); //objectConsole.log(typeof new person ()); //objectConsole.log(typeof new person ()); // typeof를 사용하여 사용자 정의 객체가 객체인지 감지합니다.
대신 인스턴스를 사용하려면 다음을 감지합니다.
var date = new date (); var reg = new regexp (); var err = new error (); var me = new person (); if (날짜 인스턴스 날짜) {// 감지 날짜 연도 = date.getLyEar (); } if (reg instanceof regexp) {// 감지 정규 표현식 reg.test (...); } if (err instanceof error) {// 감지 예외 던지기 err; } if (me instance of person) {// 탐지 사용자 정의 객체 ...} 그러나 사람이 브라우저의 Framea 및 Frameb에 정의되어 있다고 가정 할 때 사용자 정의 객체에 문제가 있습니다. ME 객체는 Framea에서 정의되며 me instanceof Person 사용하여 진실로 감지됩니다. 그러나 사용자 정의 객체 ME가 FrameB로 전달되면 instanceof는 frameb에서 false가됩니다.
이 섹션의 시작 부분에서 언급했듯이 함수와 배열도 내장 객체이지만 다음 섹션에 남겨 둡니다. 그 이유는 함수와 배열이 사용자 정의 객체와 동일한 문제를 가지고 있기 때문입니다. 따라서 함수 및 배열은 일반적으로 인스턴스를 사용하지 않습니다
3. 기능
위의는 인스턴스의 탐지 기능을 사용하면 프레임을 교차 할 수 없다고 말했다. 따라서 Typeof는 크로스 프레임 일 수있는 감지에 사용됩니다.
var func = function () {}; if (typeof func === 'function') {…}그러나 IE8은 Typeof를 사용하여 DOM 기능을 감지하고 객체를 얻을 수 있으므로 IE8은 다음과 같이 사용했습니다.
console.log (typeof document.getElementById); // object, functionConsole.log가 아닌 객체 (typeof document.getElementsByTagName); // functionConsole.log가 아닌 객체 (typeof document.createElement); // 객체, IE8 이전의 브라우저가 아닌 개체, doc function이 지원되는지 (문서의 "getElementById"{…4. 배열
위의 것은 인스턴스를 사용하여 배열을 감지하면 프레임을 가로 질 수 없다고 말했다. ES5 이전에는 맞춤형 탐지 방법이 있습니다. 가장 정확한 방법 : 배열에 의존하는 Tostring은 고정 문자열 "[Object Array]"를 반환하여 다음을 감지합니다 .
함수 isarray (arr) {return object.prototype.tostring.call (ARR) === "[객체 배열]";}이 방법은 정확하고 우아하기 때문에 많은 라이브러리에서 채택되었습니다. 마지막으로, 배열은 MDN을 참조하여 ES5에서 ISARRAY 방법으로 도입되었습니다. 이제 감지 방법을 사용자 정의 할 필요가 없으며 isarray () 만 사용하십시오.
다른 탐지 방법에는 자체 결함이 있으며 100% 정확할 수 없습니다. 그러나 사고 방식으로서, 그것은 배울 수 있습니다. 예를 들어, 배열이 정렬 방법을 포함하는 유일한 객체라는 사실에 의존합니다.
함수 isArray (arr) {return typeof arr.sort === "function";}정렬 메소드가 사용자 정의 객체에 대해 정의되면 메소드가 유효하지 않습니다.
V. 속성
인스턴스 객체에서 속성을 사용해야하는지 여부 를 감지하십시오. 속성이 인스턴스 객체인지 또는 프로토 타입 객체에 있는지 상관하지 않으면 간단히 사용할 수 있습니다.
예를 들어, 문자 그럴 객체 특성을 감지합니다.
var person = {name : "jack", age : 33}; if ( "name"in person) {……} //trueif(person.hasownproperty("name ")) {…} // true예를 들어 인스턴스 객체 속성 :
var person = function (name, age) {this.name = name; this.age = age;}; person.prototype.location = "shanghai"; var me = new person ( "jack", 33) if ( "name"in me) {…} //trueif(me.me.hasownproperty("name ")))) {… { … }//거짓다른 방법은 좋지 않습니다.
if (Object [propname]) // 양호하지 않음, 속성 값이 0 또는 1이 아님을 어떻게 알 수 있습니까? if (Object [propName] === null) // 좋지 않음, 속성 값이 널이 아니라는 것을 어떻게 알 수 있습니까? if (Object [propName] === 정의되지 않은) // 양호하지 않음, 속성 값이 정의되지 않았다는 것을 어떻게 알 수 있습니까?
요약
유형을 사용하여 문자열, 번호, 부울, 정의되지 않은 함수를 감지하십시오
===로 NULL을 감지하십시오
isarray ()로 배열 감지
인스턴스를 사용하여 내장 개체 (기능 및 배열 제외) 및 사용자 정의 객체를 감지하십시오.
hasownproperty를 사용하여 속성이 인스턴스 객체에 있는지 여부를 감지합니다. 속성이 인스턴스 객체인지 또는 프로토 타입 객체에 있는지 상관하지 않으면 간단히 사용할 수 있습니다.
좋아, 그것은 다양한 유형의 JavaScript를 감지하는 방법에 대한이 기사의 전부입니다. 모든 사람 이이 기사의 내용을주의 깊게 연구 할 수 있기를 바랍니다. 모든 사람이 JavaScript를 배우는 데 도움이 될 수 있습니다.