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.
No ambiente de nó, globalThis tem o mesmo valor que o objeto global.
No ambiente web, globeThis tem o mesmo valor do objeto janela.
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.
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.
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:
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.