A diferença entre nulo e indefinido em JavaScript
Referência
JavaScriptUso típico de nulo
Como um parâmetro de função, significa que o parâmetro de função não é um objeto
function myFn(obj) {
if(null == obj) {
// code
}
}
Como o fim da cadeia de protótipos de objetos
Object.getPrototypeOf(Object.prototype);
Ao liberar a variável, atribua nulo à variável
let o={
code:'abc'
};
o = null;
Uso típico de indefinido
A variável é declarada, mas não atribuída, o valor da variável é indefinido
let o;
console.log(o); //undefined
O parâmetro que a função deve fornecer não é fornecido ao chamar, então o valor do parâmetro que não é fornecido é indefinido
function myFn(o) {
console.log(o);
}
myFn(); //undefined
Propriedades que o objeto não contém, o valor é indefinido
let o={
code:'abc'
};
console.log(o.name); //undefined
Quando a função não retorna um valor, ela retorna indefinido por padrão
function myFn(obj) {
obj = 'a';
}
console.log(myFn()); //undefined
Semelhanças entre nulo e indefinido
Falso quando convertido para booleano
console.log(Boolean(null)); // false
console.log(Boolean(undefined)); // false
A diferença entre nulo e indefinido
O resultado é diferente quando convertido em um número. O resultado da conversão nula é um valor de número válido de 0, e o resultado da conversão indefinida é NaN.
console.log(Number(null)); // 0
console.log(Number(undefined)); // NaN
Os dois tipos são diferentes, o tipo de nulo é objeto e o tipo de indefinido é indefinido.
console.log(typeof null); //object
console.log(typeof undefined); //undefined
compare nulo e indefinido
Para distinguir entre nulo e indefinido, apenas congruência pode ser usada. Em congruência, ele irá comparar estritamente se os dois tipos são iguais.
console.log(Boolean(null == undefined)); // true
console.log(Boolean(null === undefined)); // false
Resumindo
Após a comparação acima, temos uma compreensão clara desses dois tipos. Normalmente, quando julgamos se uma variável tem um valor válido ao escrever o código, não precisamos distinguir entre os dois, apenas usá-lo como um tipo booleano. Mas quando precisamos julgar se a propriedade existe, devemos usar estritamente o tipo para julgar indefinido. Finalmente, se passarmos um valor numérico, devemos primeiro fazer um julgamento e não pode ser diretamente convertido para um tipo numérico, caso contrário, nulo nos fará obter resultados anormais e undefined calculará diretamente o resultado inválido NaN.