[Objetos embutidos no padrão JavaScript] - atributo de valor

Brevemente

Essas propriedades globais internas retornam um valor simples que não possui propriedades ou métodos próprios.

As propriedades de valor dos objetos integrados padrão do JavaScript são:

  • globalThis
  • Infinidade
  • NaN
  • indefinido

globalThis

O atributo global globalThis contém o valor this global, semelhante ao objeto global (objeto global).
globalThis fornece uma maneira padrão de obter o objeto this global (ou seja, o próprio objeto global) em diferentes ambientes. Ao contrário de propriedades como window ou self, ele garante que funcione com e sem uma janela. Portanto, você pode usar globalThis sem se preocupar com seu ambiente operacional. Para mnemônicos, você só precisa lembrar que this no escopo global é globalThis.
insira a descrição da imagem aqui

No ambiente de nó, globalThis tem o mesmo valor que o objeto global.

insira a descrição da imagem aqui

No ambiente web, globeThis tem o mesmo valor do objeto janela.

insira a descrição da imagem aqui

Infinidade

A propriedade global Infinity é um valor numérico que representa o infinito.
O valor inicial de Infinity é Number.POSITIVE_INFINITY (constante, representando infinito). Infinito (infinito positivo) é maior que qualquer valor.
insira a descrição da imagem aqui

NaN

A propriedade global NaN é um valor que representa não-um-número.
O valor inicial de NaN não é um número — o mesmo valor de Number.NaN. Em navegadores modernos, NaN é uma propriedade não configurável e não gravável. Mesmo que não seja, evite substituí-lo. NaN raramente é usado em programas.
Existem cinco tipos diferentes de operações que retornam NaN :

  • Falha na conversão de número (por exemplo, uma conversão explícita como parseInt("blabla"), Number(undefined) ou uma conversão implícita como Math.abs(undefined))
  • Operações matemáticas que não resultam em números reais (por exemplo, Math.sqrt(-1))
  • Infinito (por exemplo, 0 * Infinito, 1 ** Infinito, Infinito / Infinito, Infinito - Infinito)
  • Um método ou expressão cujos operandos são convertidos para NaN (por exemplo, 7 ** NaN, 7 * "blabla") - isso significa que NaN é contagioso
  • Outros casos em que valores inválidos são representados como números (por exemplo, data inválida new Date("blabla").getTime(), "".charCodeAt(1))

As características do NaN são as seguintes :

  • Se NaN envolve operações matemáticas (mas não operações bit a bit), o resultado geralmente é NaN também
  • Quando NaN é um dos operandos de qualquer comparação relacional (>, <, >=, <=), o resultado é sempre falso
  • NaN não é igual a (via、!=、= e !==) qualquer outro valor - inclusive com outro valor NaN

NaN também é um dos valores falsos em JavaScript.
insira a descrição da imagem aqui
Diferença entre isNaN() e Number.isNaN() : O primeiro retorna true se o valor atual for, ou seria se fosse convertido em um número, NaN. E o último só é verdadeiro se o valor atualmente for NaN:
insira a descrição da imagem aqui
Além disso, alguns métodos de array não podem encontrar NaNs, enquanto outros podem. Ou seja, procurar o índice (indexOf(), lastIndexOf()) não pode encontrar NaN, enquanto procurar o valor (includes()) pode:

/**
 * 此外,一些数组方法不能找到 NaN,而另一些可以。也就是说,查找索引的(indexOf()、lastIndexOf())不能找到 NaN,而查找值的(includes())可以:
 */
const arr = [2, 4, NaN, 12];
arr.indexOf(NaN); // -1
arr.includes(NaN); // true

// Methods accepting a properly defined predicate can always find NaN
arr.findIndex((n) => Number.isNaN(n)); // 2

Os NaNs são propagados por meio de operações matemáticas, portanto, geralmente testar o NaN uma vez no final de uma computação é suficiente para detectar condições de erro. A única vez que NaN é escapado silenciosamente é ao exponenciar com um expoente de 0, que imediatamente retorna 1 sem testar o valor da base.

NaN ** 0 === 1; // true

indefinido

undefined é uma propriedade do objeto global. Ou seja, é uma variável no escopo global. O valor inicial de indefinido é o tipo de dado primitivo indefinido.
O tipo de uma variável que não recebeu um valor é indefinido e o valor também é indefinido (indicando que a variável é apenas declarada e não é atribuído um valor). Caso o método ou a variável operada no comando não tenha sido atribuído, será retornado indefinido.

function test(a){
    
    
    console.log(typeof a);    // undefined
    return a;
}

test();                       // 返回"undefined"

Se uma função não usar a instrução return para especificar o valor de retorno, ela retornará um valor indefinido.
É uma péssima ideia usá-lo como um identificador (nome da variável) em um escopo não global (porque indefinido não é uma palavra reservada (en-US))), porque dificultará a leitura do seu código Manutenção e solução de problemas .

// 不要这样做!

// 打印 'foo string' PS:说明 undefined 的值和类型都已经改变
(function() {
    
    
var undefined = 'foo';
console.log(undefined, typeof undefined)
})()

// 打印 'foo string' PS:说明 undefined 的值和类型都已经改变
(function(undefined) {
    
    
console.log(undefined, typeof undefined)
})('foo')

Você pode usar indefinido e os operadores de igualdade ou desigualdade estritos para determinar se uma variável tem um valor. No código abaixo, a variável x é indefinida e a instrução if será avaliada como verdadeira.

var x;

if (x === undefined) {
    
    
// 执行这些语句
} else {
    
    
// 这些语句不会被执行
}

Alternativamente, typeof pode ser usado:

var x;
if(typeof x === 'undefined') {
    
    
    // 执行这些语句
}
// 使用 typeof的原因是它不会在一个变量没有被声明的时候抛出一个错误。
// 这里没有声明 y
if(typeof y === 'undefined') {
    
           // 没有错误,执行结果为 true
   console.log("y is " + typeof y )  // y is undefined
}

if(y === undefined) {
    
                    // ReferenceError: y is not defined

}

JavaScript é uma linguagem com escopo estático, portanto, se uma variável é declarada pode ser determinada se ela é declarada em um contexto envolvente. A única exceção é o escopo global, mas o escopo global está vinculado ao objeto global, portanto, para verificar se uma variável existe no contexto global, você pode verificar se essa propriedade existe no objeto global (como usar o operador in) .

if ('x' in window) {
    
    
  // 只有 x 被全局性的定义 才会执行这些语句
}

O operador void é uma terceira alternativa. O operador void retorna indefinido.

var x;
if(x === void 0) {
    
    
    // 执行这些语句
}

// 没有声明 y
if(y === void 0) {
    
    
    // 抛出一个 RenferenceError 错误 (与`typeof`相比)
}

epílogo

acabou.

Acho que você gosta

Origin blog.csdn.net/qq_43231248/article/details/131550657
Recomendado
Clasificación