Análise de tipos de dados JavaScript

Análise de tipos de dados JavaScript

Recentemente, revisei os fundamentos do JS e descobri que meu entendimento de BigInt e Number não é muito profundo, e meu entendimento de NaN não está correto, então pretendo escrever um artigo para explicá-lo em detalhes.

Artigo de referência :

Dicas : Depois de estudar este artigo, você terá uma compreensão ampla dos oito tipos de dados de JavaScript, adequados para iniciantes assistirem ou revisarem, não adequados para uma compreensão aprofundada.

  • Existem dois tipos de dados em JS
    • Tipos de dados básicos : Number, String, Boolean, Null, Undefined, Symbol (novo no ES6), BigInt (novo no ES11)
    • Tipo de dados de referência : Objeto (objeto simples, função, data, matemática, matriz, etc.)

tipo de dados básico

característica

  • Um objeto wrapper (Number, String, etc.) contendo o valor primitivo correspondente .
  • Segmento de dados simples armazenado na memória da pilha .
  • Os dados são imutáveis, ou seja, não podem ser modificados à força Array.prototype.sort.call('abc')e a modificação relatará um erro.
  • Não há nenhuma _proto_propriedade .

julgamento

  • Você pode usar typeofpara determinar o tipo de dados.
  • Deve-se notar aqui que typeof(null) == 'object' o tipo de null será julgado erroneamente como object .
    • nullA obtenção de erros de detecção é um problema que restou da história. JSNa versão inicial do , foi usado um sistema de 32 bits. Por considerações de desempenho, foi usado o tipo de informação de variáveis ​​de armazenamento de ordem inferior. 000O início representava um objeto, mas nullrepresentava todos os zeros , por isso foi mal interpretado como object.
tipo resultado
Corda "corda"
Número "número"
boleano "boleano"
Indefinido "indefinido"
Objeto、Array、RegExp、nulo、Data、Erro "objeto"
Função "função"
Símbolo (novo no ES6) "símbolo"
BigInt (novo no ES11) "grande"

Número

  • Número pode ser definido diretamente usando números ou notação científica.
  • A classe de dados básica Number em JavaScript é um número de ponto flutuante de precisão dupla . O intervalo seguro máximo que ele pode representar é mais ou menos 9007199254740991, ou seja, 2 à 53ª potência menos 1 e todos os números maiores que 2 à 53ª poder pode ser expresso BigInt.
let x1 = 34.00
let x2 = 34
let x3 = 123e5
let x4 = 123e-5
let x5 = new Number(123)

NaN

  • Aqui está um ponto de atenção typeof NaNpara o Número.
  • A propriedade NaN é um valor especial que representa um valor não numérico. Este atributo é usado para indicar que um valor não é um número. Um objeto Number pode ser definido com esse valor para indicar que não é um valor numérico.
  • função global isNaN() para determinar se um valor é um valor NaN.
typeof NaN === "number" // true
// NaN 同任何数比较均为false
NaN === NaN // false

isNaN("0")  // false
isNaN("ssss")  // true

BigInt

  • Um Bigint pode ser definido anexando um literal inteiro nou chamando uma função BigInt()sem newoperadores, que não pode ser inicializada com newa palavra-chave .
  • BigInté um novo tipo primitivo em JavaScript que pode representar números inteiros com precisão arbitrária . Usando , inteiros grandes podem ser armazenados e manipulados com segurança, BigIntmesmo que excedam os limites de inteiro seguro do JavaScript .Number
  • Adicionado no ES11.
let x1 = 123n
let x2 = BigInt(123)
  • BigInt é diferente de Number.
    • Não pode ser usado para Mathmétodos em objetos.
    • Não pode ser misturado com nenhuma Numberinstância, ambos devem ser convertidos para o mesmo tipo. Tenha cuidado ao converter os dois tipos para frente e para trás, pois as variáveis ​​podem perder a precisão quando BigIntconvertidas em variáveis.Number

Corda

  • Uma String pode ser definida diretamente usando uma String.
  • Além de nulo, indefinido, outros podem toStringobter o valor de sua string correspondente por meio do método.
let s1 = "qwe"
let s2 = new String("sad")
let s3 = 'sdg'
let s4 = `dbs`

({
    
    }).toString() // [object Object]
(123).toString() // "123"

// 字符串与其他类型相加会发生奇怪的事情
{
    
    } + '' //  0
[] + '' // ''

boleano

  • verdadeiro e falso são booleanos.

  • Apenas os sete valores a seguir são falsos em JS .

    • indefinido
    • nulo
    • falso
    • NaN
    • ''
    • 0
    • -0
  • Todo o resto é verdade .

Boolean(null) // false
Boolean(undefined) // false
Boolean(4) // false

Nulo

  • null é o tipo de dados nulo.
  • Sua expressão é nula. Frequentemente usado para liberar memória ou inicializar atribuições. É igual a indefinido, mas não estritamente igual a indefinido.
let a = null

undefined == null // true
undefined === null // false

Indefinido

  • indefinido é o tipo de dados Indefinido.
  • Seu significado é indefinido ou definido não atribuído. É igual a nulo, mas não estritamente igual a nulo.
let a = undefined

null == undefined // true
null === undefined // false

Símbolo

Os nomes de propriedade de objeto do ES5 são todos strings, o que pode facilmente causar conflitos de nome de propriedade. Por exemplo, se você usar um objeto fornecido por outros, mas quiser adicionar um novo método (modo mixin) a esse objeto, o nome do novo método pode entrar em conflito com o método existente. Seria ótimo se houvesse um mecanismo para garantir que o nome de cada atributo seja único, de modo a evitar fundamentalmente conflitos de nome de atributo. É Symbolpor isso que o ES6 o introduziu.

  • Symbol, representando um valor único.
  • Os valores dos símbolos são Symbol()gerados por funções.
  • Existem dois tipos de nomes de atributo de objeto, um é a string original e o outro é o tipo Symbol recém-adicionado. Todos os nomes de atributos que pertencem ao tipo Symbol são exclusivos e podem ser garantidos para não entrar em conflito com outros nomes de atributos.
let s = Symbol();

typeof s
// "symbol"

let s1 = Symbol('foo');
let s2 = Symbol('bar');

s1 // Symbol(foo)
s2 // Symbol(bar)

s1.toString() // "Symbol(foo)"
s2.toString() // "Symbol(bar)"

tipo de dados de referência

característica

  • Dois espaços são alocados quando um tipo de referência está sendo criado
    • Uma parte fica no heap , armazenando os dados do próprio tipo de referência (claro que a quantidade de dados será relativamente grande)
    • Uma parte está na pilha , armazenando referências aos dados no heap (armazenando endereços de memória no heap, ou seja, ponteiros)
  • Tipos de referência são mutáveis: ielet a={}; a.x=1;
  • functionOs parâmetros são passados ​​por valor, as referências não podem ser modificadas

julgamento

  • Passe a Object.prototype.toString.calldetecção
let a = function (){
    
    }
let b = []
let c = {
    
    }

Object.prototype.toString.call(a) // [object Function]
Object.prototype.toString.call(b) // [object Array]
Object.prototype.toString.call(c) // [object Object]

typeof a // function
typeof b // object
typeof c // object

Objeto

  • JS tudo é um objeto
  • O JavaScript fornece vários objetos integrados, como String, Date, Array, etc. Os objetos são apenas tipos de dados especiais com propriedades e métodos.
    • Boolean pode ser um objeto.
    • Um tipo numérico pode ser um objeto.
    • Uma string também pode ser um objeto
    • data é um objeto
    • Expressões matemáticas e regulares também são objetos
    • matriz é um objeto
    • Mesmo funções podem ser objetos
let x1 = {
    
    }
let x2 = new Object()
// 基本类型的包装类 使用typeof判为object
let x3 = new String()
let x4 = new Number()

typeof x1 // "object"
typeof x2 // "object"
typeof x3 // "object"
typeof x4 // "object"

Função

  • Uma função é um tipo especial de objeto
  • Uma função também é um bloco de código funcional, um script com um curto intervalo fechado.Se o mesmo trecho de código for usado várias vezes, ele pode ser encapsulado em uma função, o que permite que seja usado conforme necessário no código.
  • Encapsulamento numérico para evitar digitação repetida muito do mesmo conteúdo, mas o poder real da função está na capacidade de passar parâmetros, você pode passar dados diferentes para eles e usar esses dados para concluir a operação predeterminada
  • As funções são cidadãos, objetos e valores de primeira classe que podem ser armazenados em uma variável, array ou objeto
  • As funções podem ser passadas para funções e retornadas por funções, e as funções têm propriedades
  • Uma função sempre tem um valor de retorno (ou seja, existe uma declaração de retorno, exceto para a função construtora, pois ela retornará a chamada da função construtora por padrão, e quando a chamada do construtor for executada, ela retornará o display)
var funA = function(){
    
    
    console.log("我是匿名函数保存在变量funA中");
}
var funB = [function(){
    
    
    console.log("我是匿名函数保存在数组funB中");
}]
var funC = {
    
    
     method:function(){
    
    
        console.log("我是匿名函数保存在对象funC中");
    }
}
// 函数的调用
funA();     // 普通函数的调用
funB[0]();  // 函数存入数组中的调用
funC.method(); // 对象调用方法的使用

⭐O conteúdo acima é todo o conteúdo deste artigo, se for útil para você, por favor, dê um like

Acho que você gosta

Origin blog.csdn.net/lonelysnowman/article/details/128699253
Recomendado
Clasificación