1. Introduzir primeiro os 5 tipos originais
5 tipos primitivos em javascript são string , número , booleano , indefinido , nulo
var name = "jack"; var idade = 32; var single = false; var app; //undefinedConsole.log(typeof nome); //StringConsole.log(Typeof Age); //NumberConsole.log(Typeof Single); //BooleaConsole.log(Typeof App); //undefinedConsole.log(typeof null); //objeto
Verificou -se que os outros quatro tipos básicos , exceto NULL, podem ser identificados por tipoof :
if (typeof nome === "string") {name += "zhang"; } if (typeof Age === "Número") {Age ++; } if (typeof single === "boolean" && single) {…} if (typeof app === "indefinido") {app = {}; }Porque o tipo de null receberá objeto, use === para detectar nulo diretamente:
if (el === null) {…}2. Objeto
Os objetos JavaScript incluem objetos internos ( data, regexp, erro , etc.) e objetos personalizados .
(Observe que, embora a função e a matriz também sejam objetos embutidos, eles são discutidos separadamente na próxima seção)
Os objetos não podem ser detectados usando tipos básicos do tipo de tipo de, porque os resultados detectados são todos objetos :
console.log (tipo de new date ()); //ObjectConsole.log(Typeof new regexp ()); //ObjectConsole.log(Typeof new Error ()); //ObjectConsole.log(Typeof New Pessoa ()); //ObjectConsole.log(Typeof New Pessoa ()); // usando o tipoof para detectar que o objeto personalizado também é objeto
Para usar a instância do em vez disso para detectar:
var date = new Date (); var reg = new regexp (); var err = new Error (); var Me = new Person (); if (data de data de data) {// data de detecção ano = data.getlyear (); } if (Ref instância de regexp) {// detecção de expressão regular reg.test (...); } if (err instância do erro) {// Exceção de detecção TRANHO ERR; } if (me instanceof pessoa) {// Detecção objeto personalizado ...} Mas há um problema com objetos personalizados, assumindo que a pessoa seja definida tanto em Framea e Frameb do navegador. O objeto ME é definido em Framea e é detectado como verdadeiro usando me instanceof Person . Mas quando o objeto personalizado me é passado para o Frameb, a instância do FALSE será falsa no Frameb.
Como mencionado no início desta seção, embora a função e a matriz também sejam objetos internos, eles são deixados para a próxima seção. O motivo é que a função e a matriz também têm os mesmos problemas acima que os objetos personalizados. Portanto, função e matriz geralmente não usam a instância de
3. Função
O acima dito que o uso de instância da função de detecção não pode cruzar quadros. Portanto, o tipo de é usado para detectar, que pode ser de quadro cruzado:
var func = function () {}; if (typeof func === 'function') {…}No entanto, o IE8 usou o TypeOF para detectar funções DOM e receberia um objeto, então o IE8 usado em:
console.log (typeof docum.getElementById); // objeto, não functionConsole.log (typeof Document.getElementsByTagName); // objeto, não functionConsole.log (typeof docum.createElement); // objeto, não funcione // IE navegadores antes do IE8, use para detectar se a função DOM é suportada se ("getElementById" no documento) {…} if ("getElementsByTagName" no documento) {…} if ("getSetEmentsByTagname" no documento) {…} se ("createment" em (} if ("documentem) em (" documentem) em ("…} if (" getselementsByTagname "no document) {…} se (" createment "em (} if (" documentem) em () em ", em", em documentação) em (…} if ("getSbymentsbyTagname" no documento) {…} se ("e", ", em", em ", em", "," getSbyTagname "no document) {…} se (".4. Array
O acima dizia que o uso de instância para detectar que a matriz não pode cruzar quadros. Antes do ES5, temos métodos de detecção personalizados. O método mais preciso: a tostragem que depende da matriz retornará a sequência fixa "[Array do objeto]" para detectar :
função isarray (arr) {return object.prototype.toString.call (arr) === "[objeto Array]";}Esse método é preciso e elegante, por isso foi adotado por muitas bibliotecas. Finalmente, o Array foi introduzido como um método de isarray no ES5, referindo -se ao MDN. Agora você não precisa personalizar o método de detecção, basta usar o isarray () .
Outros métodos de detecção têm seus próprios defeitos e não podem ser 100% precisos. Mas como uma maneira de pensar, pode ser aprendido com isso. Por exemplo, confiar no fato de que a matriz é o único objeto que contém o método de classificação é detectado:
função isarray (arr) {return typeof arr.sort === "function";}Se o método de classificação também for definido para um objeto personalizado, o método será inválido.
V. Atributos
Detecte se a propriedade deve ser usada no objeto de instância. Se você não se importa se o atributo está em um objeto de instância ou em um objeto de protótipo, você pode simplesmente usar em
Por exemplo, detecte propriedades de objeto literal:
var pessoa = {name: "jack", idade: 33}; if ("nome" pessoalmente) {…} //trueif(person.HasownProperty("name ") {…} // truePor exemplo, Propriedades do objeto de instância:
var pessoa = function (nome, idade) {this.name = name; this.age = age;};Person.prototype.location = "Shanghai";var me = new Person("Jack", 33)if("name" in me) { … } //trueif(me.hasOwnProperty("name")) { … } //trueif("location" in me) { … } //trueif(me.hasOwnProperty("location")) {…} // falseOutros métodos não são bons:
if (objeto [propname]) // não é bom, como você sabe que o valor da propriedade não é 0 ou 1? if (object [propname] === null) // não é bom, como você sabe que o valor da propriedade não é nulo? if (object [propname] === indefinido) // não é bom, como você sabe que o valor da propriedade não é indefinido?
Resumir
Use o tipoof para detectar string, número, booleano, indefinido, função
Detectar nulo com ===
Detectar a matriz com isarray ()
Use a instância do para detectar objetos internos (exceto função e matriz) e objetos personalizados
Use o HasOwnProperty para detectar se a propriedade está no objeto Instância. Se você não se importa se o atributo está em um objeto de instância ou em um objeto de protótipo, você pode simplesmente usar em
Ok, isso é tudo para este artigo sobre como detectar vários tipos de JavaScript. Espero que todos possam estudar com cuidado o conteúdo deste artigo, o que pode ser útil para que todos aprendam JavaScript.