1. Primero introduzca los 5 tipos originales
5 tipos primitivos en JavaScript son cadena , número , booleano , indefinido , nulo
var name = "Jack"; var age = 32; var single = false; var app; //undefinedconsole.log(typeof name); //stringconsole.log(typeof Age); //numberConsole.log(TypeF Single); //boolequonsole.log(TypeF App); //undefinedconsole.log(typeof null); //objeto
Se descubrió que los otros cuatro tipos básicos , excepto NULL, se pueden identificar por tipoF :
if (typeof name === "String") {name += "zhang"; } if (typeof age === "número") {edad ++; } if (typeof single === "boolean" && single) {...} if (typeof app === "indefinido") {app = {}; }Debido a que TypeOf Null obtendrá objeto, use === para detectar NULL directamente:
if (el === null) {…}2. Objeto
Los objetos JavaScript incluyen objetos incorporados ( fecha, regexp, error , etc.) y objetos personalizados .
(Tenga en cuenta que aunque la función y la matriz también son objetos incorporados, se discuten por separado en la siguiente sección)
Los objetos no se pueden detectar usando tipos de tipos como los tipos básicos, porque los resultados detectados son todos objetos :
console.log (typeof new date ()); //ObjectConsole.log(Typef New Regexp ()); //ObjectConsole.log(TypeF New Error ()); //ObjectConsole.log(TypeOf nueva persona ()); //ObjectConsole.log(TypeOf nueva persona ()); // Uso de typeof para detectar que el objeto personalizado también es objeto
Para usar instancia en su lugar para detectar:
var date = new Date (); var reg = new Regexp (); var err = new Error (); var me = new Person (); if (fecha instancia de fecha) {// fecha de detección año = date.getblyear (); } if (reg instanciaf regexp) {// detección de expresión regular reg.test (...); } if (err instancef error) {// Excepción de detección de lanzamiento err; } if (me instancia de persona) {// Detección Objeto personalizado ...} Pero hay un problema con los objetos personalizados, suponiendo que esa persona se define tanto en framea como en marco del navegador. El objeto ME se define en Framea, y se detecta como verdadero usando me instanceof Person . Pero cuando el objeto personalizado me pase a FrameB, InstanceOf será falso en FrameB.
Como se mencionó al comienzo de esta sección, aunque la función y la matriz también son objetos incorporados, se dejan a la siguiente sección. La razón es que la función y la matriz también tienen los mismos problemas anteriores que los objetos personalizados. Por lo tanto, la función y la matriz generalmente no usan instancia de
3. Función
Lo anterior dijo que el uso de la función de detección de instancia no puede cruzar los marcos. Por lo tanto, se utiliza typeof para detectar, lo que puede ser de marco cruzado:
var func = function () {}; if (typeof func === 'function') {...}Sin embargo, IE8 usó typeOf para detectar funciones DOM y obtendría un objeto, así que IE8 usó en:
console.log (typeof document.getElementById); // objeto, no functionConsole.log (typeof document.getElementsByTagName); // objeto, no functionConsole.log (typeof document.createElement); // objeto, no la función // es decir, los navegadores antes de IE8, use para detectar si la función DOM es compatible si ("getElementById" en el documento) {...} if ("getElementsByTagName" en el documento) {...} if ("getElementsByTagName" en el documento) {...} if ("CreeLement" en documento) {...}4. Array
Lo anterior dijo que usar instancia para detectar que la matriz no puede cruzar los marcos. Antes de ES5, tenemos métodos de detección personalizados. El método más preciso: ToString que depende de la matriz devolverá la cadena fija "[matriz de objetos]" para detectar :
función isarray (arr) {return object.prototype.ToString.call (arr) === "[Array de objetos]";}Este método es preciso y elegante, por lo que fue adoptado por muchas bibliotecas. Finalmente, la matriz se introdujo como un método isArray en ES5, refiriéndose a MDN. Ahora no necesita personalizar el método de detección, solo use isArray () .
Otros métodos de detección tienen sus propios defectos y no pueden ser 100% precisos. Pero como una forma de pensar, se puede aprender de ella. Por ejemplo, confiar en el hecho de que la matriz es el único objeto que contiene el método de clasificación se detecta:
función isArray (arr) {return typeOf arr.sort === "función";}Si el método de clasificación también se define para un objeto personalizado, el método no será válido.
V. Atributos
Detectar si la propiedad debe usarse en el objeto de instancia. Si no le importa si el atributo está en un objeto de instancia o en un objeto prototipo, simplemente puede usar en
Por ejemplo, detectar propiedades del objeto literal:
var persona = {nombre: "Jack", edad: 33}; if ("nombre" en persona) {...} //trueif(person.hasownproperty("Name ")) {...} // VerdaderoPor ejemplo, las propiedades del objeto de instancia:
var persona = function (nombre, edad) {this.name = name; this.age = edad;}; persona.prototype.location = "shanghai"; var me = new Person ("Jack", 33) if ("Nombre" en mí) {...} //trueif(me.hasownproperty("Name ")) {...} // trueif (" ubicación "en me) {...} //trueif(me.hasownproperty("location ")) {...} // falsoOtros métodos no son buenos:
if (objeto [propname]) // no bueno, ¿cómo sabe que el valor de la propiedad no es 0 o 1? if (objeto [propname] === null) // no es bueno, ¿cómo sabe que el valor de la propiedad no es nulo? if (objeto [propname] === indefinido) // no bueno, ¿cómo sabe que el valor de la propiedad no está indefinido?
Resumir
Use el tipof para detectar la función de cadena, número, booleano, indefinido,
Detectar nulo con ===
Detectar matriz con isarray ()
Use InstanceOf para detectar objetos incorporados (excepto la función y la matriz) y los objetos personalizados
Use aSownProperty para detectar si la propiedad está en el objeto de instancia. Si no le importa si el atributo está en un objeto de instancia o en un objeto prototipo, simplemente puede usar en
De acuerdo, eso es todo para este artículo sobre cómo detectar varios tipos de JavaScript. Espero que todos puedan estudiar el contenido de este artículo cuidadosamente, lo que puede ser útil para que todos aprendan JavaScript.