Eu sempre pensei: nullvocê está definido como vazio, undefinedestá vazio porque não foi definido. Ou nullestá vazio de propósito, enquanto undefinedainda está vazio. Basicamente, mostra intenção.
NaN. Veja por si mesmo. console.log (nulo-indefinido). A diferença entre nulo e indefinido é NaN. (Note-se que esta é uma tentativa de humor, antes que você me chama de mal-entendido a pergunta.)
Ivan
Respostas:
1040
Em JavaScript, undefinedsignifica que uma variável foi declarada, mas ainda não foi atribuída um valor, como:
Citação do livro Professional JS for Web Developers (Wrox): "Você pode se perguntar por que o operador typeof retorna 'object' com um valor nulo. Na verdade, foi um erro na implementação JavaScript original que foi copiada no ECMAScript. Hoje , é racionalizado que null é considerado um espaço reservado para um objeto, mesmo que, tecnicamente, seja um valor primitivo ".
Captain Sensible
34
a variável também pode não estar definida. por exemplo: console.log (typeof (abc)); indefinido
Nir O.
19
O comentário de Nir O. é muito importante. Se eu quero ter uma variável que não tem valor no começo, escrevo "... = null", por exemplo "myvar = null". Dessa forma - quando digito "if (myxar == null) {...}" - o bloco if não é executado. Não tenho essa vantagem com undefined: myvar = undefined; myvar = 4; if (typeof myxar == "indefinido") {...}
Wolfgang Adamec
11
@ Wolfgang Adamec, programação livre de erros não é sobre erros de digitação.
Jorge Fuentes González
12
portanto, valor basicamente nulo significa que uma variável foi definida explicitamente como (sem valor = nulo) ou foi inicializada e definida como nada. Enquanto indefinido significa. provavelmente nunca foi inicializado ou, se foi, nunca foi definido.
O valor indefinido é um valor primitivo usado quando uma variável não foi atribuída a um valor.
O valor nulo é um valor primitivo que representa a referência nula, vazia ou inexistente.
Quando você declara uma variável através de var e não atribui um valor a ela, ela terá o valor indefinido. Por si só, se você tentar WScript.Echo () ou alertar () esse valor, não verá nada. No entanto, se você anexar uma string em branco a ela, de repente ela aparecerá:
var s;WScript.Echo(s);WScript.Echo(""+ s);
Você pode declarar uma variável, defini-la como nula e o comportamento é idêntico, exceto que você verá "nulo" impresso versus "indefinido". Esta é realmente uma pequena diferença.
Você pode até comparar uma variável indefinida como nula ou vice-versa, e a condição será verdadeira:
undefined==nullnull==undefined
Eles são, no entanto, considerados dois tipos diferentes. Enquanto indefinido é um tipo exclusivo, nulo é considerado um valor de objeto especial. Você pode ver isso usando typeof (), que retorna uma string que representa o tipo geral de uma variável:
var a;WScript.Echo(typeof(a));var b =null;WScript.Echo(typeof(b));
A execução do script acima resultará na seguinte saída:
undefined
object
Independentemente de serem tipos diferentes, eles ainda agirão da mesma forma se você tentar acessar um membro de um deles, por exemplo, ou seja, eles lançarão uma exceção. Com o WSH, você verá que o temido "'varname' é nulo ou não é um objeto" e isso se você tiver sorte (mas esse é um tópico para outro artigo).
Você pode definir explicitamente uma variável como indefinida, mas eu não aconselho isso. Eu recomendo apenas definir variáveis como nulas e deixar indefinido o valor para as coisas que você esqueceu de definir. Ao mesmo tempo, recomendo que você sempre defina todas as variáveis. O JavaScript tem uma cadeia de escopo diferente da linguagem C, confundindo facilmente até os programadores veteranos e definir variáveis como nulo é a melhor maneira de evitar bugs com base nele.
Outra instância em que você verá um pop-up indefinido é ao usar o operador de exclusão. Aqueles de nós do mundo C podem interpretar incorretamente isso como destruindo um objeto, mas não é assim. O que essa operação faz é remover um subscrito de uma matriz ou um membro de um objeto. Para matrizes, não afeta o comprimento, mas agora esse índice é considerado indefinido.
var a =['a','b','c'];delete a[1];for(var i =0; i < a.length; i++)WScript.Echo((i+".) "+a[i]);
O resultado do script acima é:
0.) a
1.)undefined2.) c
Você também será indefinido retornado ao ler um subscrito ou membro que nunca existiu.
A diferença entre nulo e indefinido é: JavaScript nunca definirá nada como nulo, geralmente é o que fazemos. Embora possamos definir variáveis como indefinidas, preferimos null porque não é algo que é feito para nós. Quando você está depurando, isso significa que qualquer coisa definida como nula é sua e não JavaScript. Além disso, esses dois valores especiais são quase equivalentes.
Realmente uma boa resposta. Mas apenas para salientar, quando você marcou "undefined == null", a verificação de tipo não foi rigorosa. Por isso, retornou "true". Se você marcar "undefined === null", ele retornará false.
Wolverine
3
Vale a pena notar que, embora esse comentário fosse verdadeiro em 11, com o advento de parâmetros de função opcionais, o surgimento de sistemas de verificação de tipo como Flow e a difusão de React (todos os quais tratam indefinido e nulo de maneira muito diferente), a velha sabedoria de geralmente usar nulo em vez de indefinido não é mais tão rigoroso. undefined é realmente preferível a null em muitos casos em que você deseja usar explicitamente o valor padrão (por exemplo, para um parâmetro opcional ou um acessório React opcional).
0x24a537r9 15/02
66
(adicionando caracteres devido à falta de caracteres, por isso estou autorizado a postar isso.)
Você poderia incluir a atribuição da fonte da imagem, por favor?
Vega
1
@Vega Infelizmente não, eu não me lembro de onde eu o peguei em outro lugar do imgur.com e isso provavelmente é de um repost, não da fonte ORIGINAL. Nem mesmo o link incorporado aqui dá alguma pista de quem postou esta versão, então também não posso procurá-la.
Sebastian Norr 18/02
1
ha ha ha ... esta é a melhor explicação que eu já vi! legal!
Akbar Mirsiddikov 01 de
36
null é uma palavra-chave especial que indica uma ausência de valor.
pense nisso como um valor, como:
"foo" é string,
verdadeiro é booleano,
1234 é o número,
null é indefinido.
propriedade indefinida indica que uma variável não recebeu um valor incluindo nulo também. Gostar
var foo;
variável vazia definida é nulldo tipo de dadosundefined
Ambos estão representando um valor de uma variável sem valor
ANDnull não representa uma string que não tem valor - string vazia-
Gostar
var a ='';
console.log(typeof a);// string
console.log(a ==null);//false
console.log(a ==undefined);// false
Agora se
var a;
console.log(a ==null);//true
console.log(a ==undefined);//true
MAS
var a;
console.log(a ===null);//false
console.log(a ===undefined);// true
Então, cada um tem sua própria maneira de usar
indefinido use-o para comparar o tipo de dados variável
null use-o para esvaziar o valor de uma variável
var a ='javascript';
a =null;// will change the type of variable "a" from string to object
null também é um tipo de dados. Ambos indefinido e nulos são tipos e valores de dados
danwellman
9
nullÉ absolutamente um tipo de dados: msdn.microsoft.com/en-us/library/ie/7wkd9z69(v=vs.94).aspx. O fato de typeof nullretornar objecté um bug bem conhecido e documentado nas versões anteriores do ECMAScript que permanecem com compatibilidade com versões anteriores. O link que você realmente postou no seu comentário diz na metade da página "typeof null // object (erro no ECMAScript, deve ser nulo)"! Então, por favor, mostrar algum esforço de pesquisa antes de comentar sobre down-votos
danwellman
1
As definições contradizem: "ausência de valor" vs "não foi atribuído um valor". Não é o mesmo?
Zon
3
Eu discordo desta resposta. Nulo e indefinido são tipos de dados distintos. null é do tipo null e undefined é do tipo undefined. Somente ao usar um operador de verdade (==) podemos ver que o javascript diz que é verdadeiro, mas uma comparação estrita (===) produz um falso.
precisa saber é
19
null : ausência de valor para uma variável; indefinido : ausência da própria variável;
..where variável é um nome simbólico associado a um valor.
O JS pode ser gentil o suficiente para iniciar implicitamente variáveis recém-declaradas com nulo , mas isso não acontece.
var a = {}; a.n = undefined;' then ..a.hasOwnProperty ( 'n') == true` ... assim dizendo ausência de si mesma variável não é correto mais
Muhammad Umer
17
Por favor leia o texto abaixo com atenção. Ele removerá todas as suas dúvidas sobre a diferença entre nulo e indefinido no JavaScript. Além disso, você pode usar a função de utilitário fornecida abaixo para determinar exatamente os tipos.
Em JavaScript, podemos ter os seguintes tipos de variáveis.
Variáveis não declaradas
Variáveis declaradas mas não atribuídas
Variáveis atribuídas com literal indefinido
Variáveis atribuídas com literal nulo
Variáveis atribuídas com algo diferente de indefinido ou nulo
A seguir, explica cada um desses casos, um por um
Variáveis não declaradas : o seguinte é válido para variáveis não declaradas
Só pode ser verificado por typeof () que retorna a string 'undefined'
Não pode ser verificado com == ou === ou pelo operador if ou condicional ? (lança erro de referência)
Variáveis declaradas mas não atribuídas
typeof retorna a string 'indefinida'
== verifique com retornos nulos verdadeiros
== verificar com retornos indefinidos true
=== verificar com retornos nulos false
=== verificar com retornos indefinidos true
se ou operador condicional ? retorna falso
Variáveis atribuídas com literal indefinido : essas variáveis são tratadas da mesma forma que as variáveis declaradas, mas não atribuídas .
Variáveis atribuídas com literal nulo
typeof retorna a string 'objeto'
== verifique com retornos nulos verdadeiros
== verificar com retornos indefinidos true
=== verifique com retornos nulos verdadeiros
=== verifique com retornos indefinidos false
se ou operador condicional ? retorna falso
Variáveis atribuídas com algo diferente de indefinido ou nulo
typeof retorna uma das seguintes strings: 'string' , 'number' , 'boolean' , 'function' , 'object' , 'symbol'
A seguir, fornece o algoritmo para a verificação correta do tipo de uma variável:
Verifique se não foi declarado / não atribuído / atribuído com indefinido usando typeof . return se a string 'undefined' for retornada.
Verifique se há nulo usando === . retorne 'null' se verdadeiro .
Verifique o tipo real usando typeof . tipo de retorno se não for igual a 'objeto'
Chame Object.prototype.toString.call (o) para determinar o tipo de objeto real. Ele deve retornar uma string do tipo '[objectType do objeto]' para todos os objetos definidos em Javascript ou DOM . Para objetos definidos pelo usuário, ele retorna '[object Object]'
Você também pode usar a seguinte função de utilitário para determinar tipos. Atualmente, ele suporta todos os tipos de ECMA 262 2017.
Você pode considerar indefinido para representar uma ausência de valor no nível do sistema, inesperada ou semelhante a erro e nulo para representar a ausência de valor no nível do programa, normal ou esperada.
1 - Uncaught ReferenceError: variável não foi declarada em seu script, não há referência a esta variável
2 - undefined: Variável declarada mas não inicializada
3 - null: Variável declarada e é um valor vazio
null e undefined são dois tipos de objetos distintos que têm o seguinte em comum:
ambos podem conter apenas um único valor, nulo e indefinido, respectivamente;
ambos não têm propriedades ou métodos e uma tentativa de ler qualquer uma das propriedades resultará em um erro em tempo de execução (para todos os outros objetos, você obtém valor indefinido se tentar ler uma propriedade inexistente);
valores nulos e indefinidos são considerados iguais entre si e a nada mais pelos operadores ==e !=.
As semelhanças, no entanto, terminam aqui. Pela primeira vez, há uma diferença fundamental na maneira como as palavras-chave nulas e indefinidas são implementadas. Isso não é óbvio, mas considere o seguinte exemplo:
varundefined="foo";WScript.Echo(undefined);// This will print: foo
indefinido , NaN e Infinity são apenas nomes de variáveis "superglobal" pré-inicializadas - são inicializadas em tempo de execução e podem ser substituídas por variáveis globais ou locais normais com os mesmos nomes.
Agora, vamos tentar a mesma coisa com null :
varnull="foo";// This will cause a compile-time errorWScript.Echo(null);
Opa! null , true e false são palavras-chave reservadas - o compilador não permitirá que você as use como nomes de variáveis ou propriedades
Outra diferença é que indefinido é um tipo primitivo, enquanto nulo é um tipo de objeto (indicando a ausência de uma referência a objeto). Considere o seguinte:
WScript.Echo(typeoffalse);// Will print: booleanWScript.Echo(typeof0);// Will print: numberWScript.Echo(typeof"");// Will print: stringWScript.Echo(typeof{});// Will print: objectWScript.Echo(typeofundefined);// Will print: undefinedWScript.Echo(typeofnull);// (!!!) Will print: object
Além disso, há uma diferença importante na maneira como nulo e indefinido são tratados no contexto numérico:
var a;// declared but uninitialized variables hold the value undefinedWScript.Echo(a ===undefined);// Prints: -1var b =null;// the value null must be explicitly assigned WScript.Echo(b ===null);// Prints: -1WScript.Echo(a == b);// Prints: -1 (as expected)WScript.Echo(a >= b);// Prints: 0 (WTF!?)WScript.Echo(a >= a);// Prints: 0 (!!!???)WScript.Echo(isNaN(a));// Prints: -1 (a evaluates to NaN!)WScript.Echo(1*a);// Prints: -1.#IND (in Echo output this means NaN)WScript.Echo(b >= b);// Prints: -1 (as expected)WScript.Echo(isNaN(b));// Prints: 0 (b evaluates to a valid number)WScript.Echo(1*b);// Prints: 0 (b evaluates to 0)WScript.Echo(a >=0&& a <=0);// Prints: 0 (as expected)WScript.Echo(a ==0);// Prints: 0 (as expected)WScript.Echo(b >=0&& b <=0);// Prints: -1 (as expected)WScript.Echo(b ==0);// Prints: 0 (!!!)
null torna-se 0 quando usado em expressões aritméticas ou comparações numéricas - da mesma forma que falso , é basicamente apenas um tipo especial de "zero". indefinido , por outro lado, é um verdadeiro "nada" e se torna NaN ("não é um número") quando você tenta usá-lo no contexto numérico.
Note-se que nula e indefinido receber um tratamento especial a partir ==e !=operadores, mas você pode testar a verdadeira igualdade numérica de um e b com a expressão (a >= b && a <= b).
Se você souber que uma variável é apenas um número durante todo o ciclo de vida, por convenção, poderá inicializá-la para 0(ou NaNse 0for um valor importante no seu uso):
Nota: o uso inteligente de nulo deve ser a versão falsa de um Objeto porque um Objeto é sempre truee porque typeof nullretorna object. Isso significa typeof myVarObjectretornar valor consistente para o objeto e o tipo nulo.
Todos
Se você souber que uma variável possui um tipo misto (qualquer tipo durante todo o ciclo de vida), por convenção, você pode inicializá-la para undefined.
É importante notar que while undefinedpode significar que uma variável não foi declarada, mas não garante isso. Uma variável pode ser declarada como var thing;e será igual a undefined.
Yura
6
A melhor maneira de entender a diferença é primeiro limpar sua mente do funcionamento interno do JavaScript e apenas entender as diferenças de significado entre:
let supervisor ="None"// I have a supervisor named "None"let supervisor =null// I do NOT have a supervisor. It is a FACT that I do not.let supervisor =undefined// I may or may not have a supervisor. I either don't know// if I do or not, or I am choosing not to tell you. It is// irrelevant or none of your business.
Há uma diferença de significado entre esses três casos, e o JavaScript distingue os dois últimos casos com dois valores diferentes, nulle undefined. Você é livre para usar esses valores explicitamente para transmitir esses significados.
Então, quais são alguns dos problemas específicos do JavaScript que surgem devido a essa base filosófica?
Uma variável declarada sem inicializador obtém o valor undefinedporque você nunca disse nada sobre qual era o valor pretendido.
let supervisor;
assert(supervisor ===undefined);
Uma propriedade de um objeto que nunca foi definido é avaliada undefinedporque ninguém nunca disse nada sobre essa propriedade.
const dog ={ name:'Sparky', age:2};
assert(dog.breed ===undefined);
nulle undefinedsão "semelhantes" um ao outro porque Brendan Eich disse isso. Mas eles não são enfaticamente iguais entre si.
nulle undefinedfelizmente tem tipos diferentes. nullpertence ao tipo Nulle undefinedao tipo Undefined. Isso está nas especificações, mas você nunca saberia isso por causa da typeofestranheza que não repetirei aqui.
Uma função que chega ao final de seu corpo sem uma declaração de retorno explícita retorna, undefinedpois você não sabe nada sobre o que ela retornou.
A propósito, existem outras formas de "nada" no JavaScript (é bom ter estudado Filosofia ...)
NaN
Usando uma variável que nunca foi declarada e recebendo um ReferenceError
Usando uma variável local letou constdefinida em sua zona morta temporal e recebendo umReferenceError
Células vazias em matrizes esparsas. Sim, eles não são iguais, undefinedembora sejam comparados ===com os indefinidos.
$ node
>const a =[1,undefined,2]>const b =[1,,2]> a
[1,undefined,2]> b
[1,<1 empty item>,2]
Melhor resposta! A maioria das respostas ignora o fato de que você pode definir o valor de uma variável comoundefined , como no let supervisor = undefinedcaso.
J. Bruni
Obrigado e sim, o equívoco de que algo é undefinedapenas se não foi declarado ou ainda não recebeu um valor é tão desenfreado e é realmente difícil comunicar com as pessoas (embora eu continue tentando). Então, muitas pessoas lixo JavaScript para ter tanto nulle undefined, mas estes valores não têm significados completamente distintos e, na maior parte, eles funcionam bem com seus significados pretendidos (IMHO, é claro).
Ray Toal
5
No JavasSript, existem 5 tipos de dados primitivos: String, Number, Boolean, null e undefined. Vou tentar explicar com um exemplo simples
digamos que temos uma função simples
function test(a){if(a ==null){
alert("a is null");}else{
alert("The value of a is "+ a);}}
também na função acima se (a == null) for igual a se (! a)
Agora, quando chamamos essa função sem passar o parâmetro a
test(); it will alert "a is null";
test(4); it will alert "The value of a is "+4;
Além disso
var a;
alert(typeof a);
isso dará indefinido; declaramos uma variável, mas não atribuímos nenhum valor a essa variável; mas se escrevermos
var a =null;
alert(typeof a); will give alert as object
tão nulo é um objeto. de certa forma, atribuímos um valor nulo a 'a'
Para o undefinedtipo, existe um e apenas um valor: undefined.
Para o nulltipo, existe um e apenas um valor: null.
Portanto, para os dois, o rótulo é do tipo e do valor.
A diferença entre eles. Por exemplo:
null é um valor vazio
undefined é um valor ausente
Ou:
undefined ainda não teve um valor
null tinha um valor e não tem mais
Na verdade, nullé uma palavra-chave especial , não um identificador e, portanto, você não pode tratá-la como uma variável à qual atribuir.
No entanto, undefinedé um identificador . No non-strictmodo e no strictmodo, no entanto, você pode criar uma variável local do nome indefinida. Mas essa é uma ideia terrível!
function foo(){undefined=2;// bad idea!}
foo();function foo(){"use strict";undefined=2;// TypeError!}
foo();
Quando você declara uma variável em javascript, ele recebe o valor undefined. Isso significa que a variável está intocada e pode ser atribuído qualquer valor no futuro. Isso também implica que você não sabe o valor que essa variável manterá no momento da declaração.
Agora você pode atribuir explicitamente uma variável null. Isso significa que a variável não tem nenhum valor. Por exemplo - algumas pessoas não têm um nome do meio. Portanto, nesse caso, é melhor atribuir o valor nulo à variável middlename de um objeto de pessoa.
Agora, suponha que alguém esteja acessando a variável middlename do objeto de sua pessoa e ela tenha o valor undefined. Ele não saberia se o desenvolvedor esqueceu de inicializar essa variável ou se não tinha nenhum valor. Se tiver o valor null, o usuário poderá deduzir facilmente que o nome do meio não tem nenhum valor e não é uma variável intocada.
propriedades de objeto indefinidas também são indefinidas. Por exemplo "x" não está definido no objeto c e se você tentar acessar cx, ele retornará indefinido.
Geralmente, atribuímos nulo a variáveis não indefinidas.
Por artigo completo de Ryan Morr sobre este assunto ...
"Geralmente, se você precisar atribuir um valor não a uma variável ou propriedade, passá-lo para uma função ou retorná-lo de uma função, nulo é quase sempre a melhor opção. Para simplificar, o JavaScript usa indefinido e os programadores devem use null ".
Nulo e indefinido no JavaScript indicam ausência de valor.
var a =null;//variable assigned null valuevar b;// undefined
Apesar do fato de ambos existirem por falta de valor, mas: Indefinido na verdade significa que a variável não é inicializada. Funções que não retornam nada e parâmetros de função para os quais nenhum valor é fornecido, um valor indefinido é retornado. Use o operador de igualdade estrita === para distinguir entre nulo e indefinido.
OK, podemos ficar confusos quando ouvimos falar sobre nulle undefined, mas vamos começar com simplicidade, os dois são falsos e similares de várias maneiras, mas a parte estranha do JavaScript faz algumas diferenças significativas, por exemplo, typeofnull é 'object'enquanto typeofundefined é 'undefined'.
Mas se você as verificar ==como abaixo, verá que ambas são falsas :
null==undefined;//true
Além disso, você pode atribuir nulla uma propriedade de objeto ou a uma primitiva, enquanto isso undefinedpode ser alcançado simplesmente não atribuindo a nada.
Crio uma imagem rápida para mostrar as diferenças para você rapidamente.
Como typeof retorna indefinido, undefined é um tipo em que null é um inicializador que indica que a variável aponta para nenhum objeto (praticamente tudo em Javascript é um objeto).
Em javascript, todas as variáveis são armazenadas como pares de valores-chave. Cada variável é armazenada como variable_name: variable_value / reference .
indefinido significa que uma variável recebeu um espaço na memória, mas nenhum valor foi atribuído a ela. Como prática recomendada, você não deve usar esse tipo como uma atribuição.
Nesse caso, como indicar quando você deseja que uma variável fique sem valor posteriormente no código? Você pode usar o tipo
nulo , que também é usado para definir a mesma coisa, ausência de valor, mas não é o mesmo que o indefinido, pois nesse caso você realmente tem o valor na memória. Esse valor é nulo
Ambos são semelhantes, mas o uso e o significado são diferentes.
Quero adicionar uma diferença muito sutil entre nulle undefinedque é bom saber quando você está tentando aprender o Vanilla JavaScript (JS) desde o início:
nullé uma palavra-chave reservada em JS, enquanto undefinedé uma variável no objeto global do ambiente de tempo de execução em que você está.
Ao escrever o código, essa diferença não é identificável como ambas nulle undefinedsempre é usada no RHS de uma instrução JavaScript. Mas quando você os usa no LHS de uma expressão, pode observar facilmente essa diferença. Portanto, o interpretador JS interpreta o código abaixo como erro:
varnull='foo'
Dá abaixo erro:
SyntaxError não capturado: token inesperado nulo
Embora o código abaixo seja executado com êxito, embora eu não recomende isso na vida real:
varundefined='bar'
Isso funciona porque undefinedé uma variável no objeto global (objeto da janela do navegador no caso de JS do lado do cliente)
undefined='bar'realmente não atribui nenhum valor undefined(imutável), apenas não gera um erro confuso.
Dmitri Zaitsev
1
A diferença entre undefinede nullé mínima, mas há uma diferença. Uma variável cujo valor é undefinednunca foi inicializada. Uma variável cujo valor é nullrecebeu explicitamente um valor de null, o que significa que a variável foi definida explicitamente para não ter valor. Se você comparar undefinede nullusando a null==undefinedexpressão, eles serão iguais.
Esta resposta é enganosa ... veja a discussão na resposta aceita. Bottom line - null==undefinedé trueapenas por causa da conversão implícita (ou o termo equivalente em JS). Evidentemente, null===undefinedé falseporque usar quando você o usa ===também compara o tipo .
guyarad
1
Basicamente, Indefinido é uma variável global que o javascript cria no tempo de execução, se nulo significa que nenhum valor foi atribuído à variável (na verdade, nulo é um objeto).
Vamos dar um exemplo:
var x;//we declared a variable x, but no value has been assigned to it.
document.write(x)//let's print the variable x
Indefinido é o que você obterá como saída.
Agora,
x=5;
y=null;
z=x+y;
e você receberá 5 como saída. Essa é a principal diferença entre Undefined e null
Com isso, aprendi realmente os isNaN(null)retornos false- o que me surpreendeu.
J. Bruni
0
Ambos os valores especiais implicam um estado vazio.
A principal diferença é que indefinido representa o valor de uma variável que ainda não foi inicializada, enquanto nulo representa uma ausência intencional de um objeto.
O número da variável é definido, no entanto, não é atribuído com um valor inicial:
let number;
number;// => undefined
A variável numérica é indefinida, o que indica claramente uma variável não inicializada
O mesmo conceito não inicializado acontece quando uma propriedade de objeto não existente é acessada:
Como a propriedade lastName não existe em obj, o JavaScript avalia corretamente obj.lastName como indefinido.
Em outros casos, você sabe que uma variável espera reter um objeto ou uma função para retornar um objeto. Mas, por algum motivo, você não pode instanciar o objeto. Nesse caso, nulo é um indicador significativo de um objeto ausente.
Por exemplo, clone () é uma função que clona um objeto JavaScript simples. Espera-se que a função retorne um objeto:
No entanto, clone () pode ser chamado com um argumento não-objeto: 15 ou nulo (ou geralmente um valor primitivo, nulo ou indefinido). Nesse caso, a função não pode criar um clone, portanto retorna nulo - o indicador de um objeto ausente.
O operador typeof faz a distinção entre os dois valores:
Se uma variável não for inicializada, será indefinida. undefined não é um objeto. Exemplo: var MyName; console.log (typeof MyName);
Verifique a ferramenta de desenvolvimento de logon do console, ela será impressa como indefinida.
nulo é um objeto. Se você deseja que alguma variável seja nula, então nulo é usado. existe uma variável nula, mas o valor não é conhecido. null não é inicializado automaticamente.
Exemplo: var MyName = null; console.log (typeof MyName); Verifique a ferramenta de desenvolvimento csole log in, será um objeto.
null
valor em JavaScript?null
você está definido como vazio,undefined
está vazio porque não foi definido. Ounull
está vazio de propósito, enquantoundefined
ainda está vazio. Basicamente, mostra intenção.Respostas:
Em JavaScript,
undefined
significa que uma variável foi declarada, mas ainda não foi atribuída um valor, como:null
é um valor de atribuição. Pode ser atribuído a uma variável como uma representação sem valor:A partir dos exemplos anteriores, é evidente que
undefined
enull
dois tipos distintos:undefined
é um si (indefinido) Tipo enquantonull
é um objecto.e
fonte
Eu escolhi isso daqui
Quando você declara uma variável através de var e não atribui um valor a ela, ela terá o valor indefinido. Por si só, se você tentar WScript.Echo () ou alertar () esse valor, não verá nada. No entanto, se você anexar uma string em branco a ela, de repente ela aparecerá:
Você pode declarar uma variável, defini-la como nula e o comportamento é idêntico, exceto que você verá "nulo" impresso versus "indefinido". Esta é realmente uma pequena diferença.
Você pode até comparar uma variável indefinida como nula ou vice-versa, e a condição será verdadeira:
Eles são, no entanto, considerados dois tipos diferentes. Enquanto indefinido é um tipo exclusivo, nulo é considerado um valor de objeto especial. Você pode ver isso usando typeof (), que retorna uma string que representa o tipo geral de uma variável:
A execução do script acima resultará na seguinte saída:
Independentemente de serem tipos diferentes, eles ainda agirão da mesma forma se você tentar acessar um membro de um deles, por exemplo, ou seja, eles lançarão uma exceção. Com o WSH, você verá que o temido "'varname' é nulo ou não é um objeto" e isso se você tiver sorte (mas esse é um tópico para outro artigo).
Você pode definir explicitamente uma variável como indefinida, mas eu não aconselho isso. Eu recomendo apenas definir variáveis como nulas e deixar indefinido o valor para as coisas que você esqueceu de definir. Ao mesmo tempo, recomendo que você sempre defina todas as variáveis. O JavaScript tem uma cadeia de escopo diferente da linguagem C, confundindo facilmente até os programadores veteranos e definir variáveis como nulo é a melhor maneira de evitar bugs com base nele.
Outra instância em que você verá um pop-up indefinido é ao usar o operador de exclusão. Aqueles de nós do mundo C podem interpretar incorretamente isso como destruindo um objeto, mas não é assim. O que essa operação faz é remover um subscrito de uma matriz ou um membro de um objeto. Para matrizes, não afeta o comprimento, mas agora esse índice é considerado indefinido.
O resultado do script acima é:
Você também será indefinido retornado ao ler um subscrito ou membro que nunca existiu.
A diferença entre nulo e indefinido é: JavaScript nunca definirá nada como nulo, geralmente é o que fazemos. Embora possamos definir variáveis como indefinidas, preferimos null porque não é algo que é feito para nós. Quando você está depurando, isso significa que qualquer coisa definida como nula é sua e não JavaScript. Além disso, esses dois valores especiais são quase equivalentes.
fonte
(adicionando caracteres devido à falta de caracteres, por isso estou autorizado a postar isso.)
fonte
null é uma palavra-chave especial que indica uma ausência de valor.
pense nisso como um valor, como:
propriedade indefinida indica que uma variável não recebeu um valor incluindo nulo também. Gostar
variável vazia definida é
null
do tipo de dadosundefined
Ambos estão representando um valor de uma variável sem valor
AND
null
não representa uma string que não tem valor - string vazia-Gostar
Agora se
MAS
Então, cada um tem sua própria maneira de usar
indefinido use-o para comparar o tipo de dados variável
null use-o para esvaziar o valor de uma variável
fonte
null
É absolutamente um tipo de dados: msdn.microsoft.com/en-us/library/ie/7wkd9z69(v=vs.94).aspx. O fato detypeof null
retornarobject
é um bug bem conhecido e documentado nas versões anteriores do ECMAScript que permanecem com compatibilidade com versões anteriores. O link que você realmente postou no seu comentário diz na metade da página "typeof null // object (erro no ECMAScript, deve ser nulo)"! Então, por favor, mostrar algum esforço de pesquisa antes de comentar sobre down-votosnull : ausência de valor para uma variável; indefinido : ausência da própria variável;
..where variável é um nome simbólico associado a um valor.
O JS pode ser gentil o suficiente para iniciar implicitamente variáveis recém-declaradas com nulo , mas isso não acontece.
fonte
var a = {}; a.n = undefined;' then ..
a.hasOwnProperty ( 'n') == true` ... assim dizendo ausência de si mesma variável não é correto maisPor favor leia o texto abaixo com atenção. Ele removerá todas as suas dúvidas sobre a diferença entre nulo e indefinido no JavaScript. Além disso, você pode usar a função de utilitário fornecida abaixo para determinar exatamente os tipos.
Em JavaScript, podemos ter os seguintes tipos de variáveis.
A seguir, explica cada um desses casos, um por um
Variáveis não declaradas : o seguinte é válido para variáveis não declaradas
Variáveis declaradas mas não atribuídas
Variáveis atribuídas com literal indefinido : essas variáveis são tratadas da mesma forma que as variáveis declaradas, mas não atribuídas .
Variáveis atribuídas com literal nulo
Variáveis atribuídas com algo diferente de indefinido ou nulo
A seguir, fornece o algoritmo para a verificação correta do tipo de uma variável:
Você também pode usar a seguinte função de utilitário para determinar tipos. Atualmente, ele suporta todos os tipos de ECMA 262 2017.
fonte
via JavaScript: O Guia Definitivo
fonte
Vou explicar
undefined
,null
eUncaught ReferenceError
:1 -
Uncaught ReferenceError
: variável não foi declarada em seu script, não há referência a esta variável2 -
undefined
: Variável declarada mas não inicializada3 -
null
: Variável declarada e é um valor vaziofonte
Indefinido significa que uma variável foi declarada, mas não tem valor:
Nulo é uma tarefa:
fonte
null e undefined são dois tipos de objetos distintos que têm o seguinte em comum:
==
e!=
.As semelhanças, no entanto, terminam aqui. Pela primeira vez, há uma diferença fundamental na maneira como as palavras-chave nulas e indefinidas são implementadas. Isso não é óbvio, mas considere o seguinte exemplo:
indefinido , NaN e Infinity são apenas nomes de variáveis "superglobal" pré-inicializadas - são inicializadas em tempo de execução e podem ser substituídas por variáveis globais ou locais normais com os mesmos nomes.
Agora, vamos tentar a mesma coisa com null :
Opa! null , true e false são palavras-chave reservadas - o compilador não permitirá que você as use como nomes de variáveis ou propriedades
Outra diferença é que indefinido é um tipo primitivo, enquanto nulo é um tipo de objeto (indicando a ausência de uma referência a objeto). Considere o seguinte:
Além disso, há uma diferença importante na maneira como nulo e indefinido são tratados no contexto numérico:
null torna-se 0 quando usado em expressões aritméticas ou comparações numéricas - da mesma forma que falso , é basicamente apenas um tipo especial de "zero". indefinido , por outro lado, é um verdadeiro "nada" e se torna NaN ("não é um número") quando você tenta usá-lo no contexto numérico.
Note-se que nula e indefinido receber um tratamento especial a partir
==
e!=
operadores, mas você pode testar a verdadeira igualdade numérica de um e b com a expressão(a >= b && a <= b)
.fonte
tl; dr
Use
null
para definir uma variável que você sabe que é um Objeto.Use
undefined
para definir uma variável cujo tipo é misto.Esse é o meu uso das 5 primitivas e do tipo Objeto, e que explica a diferença entre «caso de uso» de
undefined
ounull
.Corda
Se você souber que uma variável é apenas uma string, durante todo o ciclo de vida, por convenção, você pode inicializá-la para
""
:Número
Se você souber que uma variável é apenas um número durante todo o ciclo de vida, por convenção, poderá inicializá-la para
0
(ouNaN
se0
for um valor importante no seu uso):ou
boleano
Se você souber que uma variável é apenas um booleano enquanto todo o ciclo de vida, por convenção, você pode inicializá-la para
false
:Objeto
Se você souber que uma variável é apenas um Objeto enquanto todo o ciclo de vida, por convenção, você pode inicializá-la para
null
:Nota: o uso inteligente de nulo deve ser a versão falsa de um Objeto porque um Objeto é sempre
true
e porquetypeof null
retornaobject
. Isso significatypeof myVarObject
retornar valor consistente para o objeto e o tipo nulo.Todos
Se você souber que uma variável possui um tipo misto (qualquer tipo durante todo o ciclo de vida), por convenção, você pode inicializá-la para
undefined
.fonte
null
é um valor especial que significa "sem valor".null
é um objeto especial porquetypeof null
retorna 'objeto'.Por outro lado,
undefined
significa que a variável não foi declarada ou não recebeu um valor.fonte
undefined
pode significar que uma variável não foi declarada, mas não garante isso. Uma variável pode ser declarada comovar thing;
e será igual aundefined
.A melhor maneira de entender a diferença é primeiro limpar sua mente do funcionamento interno do JavaScript e apenas entender as diferenças de significado entre:
Há uma diferença de significado entre esses três casos, e o JavaScript distingue os dois últimos casos com dois valores diferentes,
null
eundefined
. Você é livre para usar esses valores explicitamente para transmitir esses significados.Então, quais são alguns dos problemas específicos do JavaScript que surgem devido a essa base filosófica?
Uma variável declarada sem inicializador obtém o valor
undefined
porque você nunca disse nada sobre qual era o valor pretendido.Uma propriedade de um objeto que nunca foi definido é avaliada
undefined
porque ninguém nunca disse nada sobre essa propriedade.null
eundefined
são "semelhantes" um ao outro porque Brendan Eich disse isso. Mas eles não são enfaticamente iguais entre si.null
eundefined
felizmente tem tipos diferentes.null
pertence ao tipoNull
eundefined
ao tipoUndefined
. Isso está nas especificações, mas você nunca saberia isso por causa datypeof
estranheza que não repetirei aqui.Uma função que chega ao final de seu corpo sem uma declaração de retorno explícita retorna,
undefined
pois você não sabe nada sobre o que ela retornou.A propósito, existem outras formas de "nada" no JavaScript (é bom ter estudado Filosofia ...)
NaN
ReferenceError
let
ouconst
definida em sua zona morta temporal e recebendo umReferenceError
Células vazias em matrizes esparsas. Sim, eles não são iguais,
undefined
embora sejam comparados===
com os indefinidos.fonte
undefined
, como nolet supervisor = undefined
caso.undefined
apenas se não foi declarado ou ainda não recebeu um valor é tão desenfreado e é realmente difícil comunicar com as pessoas (embora eu continue tentando). Então, muitas pessoas lixo JavaScript para ter tantonull
eundefined
, mas estes valores não têm significados completamente distintos e, na maior parte, eles funcionam bem com seus significados pretendidos (IMHO, é claro).No JavasSript, existem 5 tipos de dados primitivos: String, Number, Boolean, null e undefined. Vou tentar explicar com um exemplo simples
digamos que temos uma função simples
também na função acima se (a == null) for igual a se (! a)
Agora, quando chamamos essa função sem passar o parâmetro a
Além disso
isso dará indefinido; declaramos uma variável, mas não atribuímos nenhum valor a essa variável; mas se escrevermos
tão nulo é um objeto. de certa forma, atribuímos um valor nulo a 'a'
fonte
Para o
undefined
tipo, existe um e apenas um valor:undefined
.Para o
null
tipo, existe um e apenas um valor:null
.Portanto, para os dois, o rótulo é do tipo e do valor.
A diferença entre eles. Por exemplo:
null
é um valor vazioundefined
é um valor ausenteOu:
undefined
ainda não teve um valornull
tinha um valor e não tem maisNa verdade,
null
é uma palavra-chave especial , não um identificador e, portanto, você não pode tratá-la como uma variável à qual atribuir.No entanto,
undefined
é um identificador . Nonon-strict
modo e nostrict
modo, no entanto, você pode criar uma variável local do nome indefinida. Mas essa é uma ideia terrível!fonte
Quando você declara uma variável em javascript, ele recebe o valor
undefined
. Isso significa que a variável está intocada e pode ser atribuído qualquer valor no futuro. Isso também implica que você não sabe o valor que essa variável manterá no momento da declaração.Agora você pode atribuir explicitamente uma variável
null
. Isso significa que a variável não tem nenhum valor. Por exemplo - algumas pessoas não têm um nome do meio. Portanto, nesse caso, é melhor atribuir o valor nulo à variável middlename de um objeto de pessoa.Agora, suponha que alguém esteja acessando a variável middlename do objeto de sua pessoa e ela tenha o valor
undefined
. Ele não saberia se o desenvolvedor esqueceu de inicializar essa variável ou se não tinha nenhum valor. Se tiver o valornull
, o usuário poderá deduzir facilmente que o nome do meio não tem nenhum valor e não é uma variável intocada.fonte
nulo e indefinido são usados para representar a ausência de algum valor.
a é inicializado e definido.
null é um objeto em JavaScript
b é indefinido e não inicializado
propriedades de objeto indefinidas também são indefinidas. Por exemplo "x" não está definido no objeto c e se você tentar acessar cx, ele retornará indefinido.
Geralmente, atribuímos nulo a variáveis não indefinidas.
fonte
Object.prototype.toString.call(null); // "[object Null]"
Por artigo completo de Ryan Morr sobre este assunto ...
"Geralmente, se você precisar atribuir um valor não a uma variável ou propriedade, passá-lo para uma função ou retorná-lo de uma função, nulo é quase sempre a melhor opção. Para simplificar, o JavaScript usa indefinido e os programadores devem use null ".
Veja Explorando o eterno abismo de nulo e indefinido
fonte
Referência: http://www.thesstech.com/javascript/null-and-undefined
fonte
OK, podemos ficar confusos quando ouvimos falar sobre
null
eundefined
, mas vamos começar com simplicidade, os dois são falsos e similares de várias maneiras, mas a parte estranha do JavaScript faz algumas diferenças significativas, por exemplo, typeofnull
é'object'
enquanto typeofundefined
é'undefined'
.Mas se você as verificar
==
como abaixo, verá que ambas são falsas :Além disso, você pode atribuir
null
a uma propriedade de objeto ou a uma primitiva, enquanto issoundefined
pode ser alcançado simplesmente não atribuindo a nada.Crio uma imagem rápida para mostrar as diferenças para você rapidamente.
fonte
Como typeof retorna indefinido, undefined é um tipo em que null é um inicializador que indica que a variável aponta para nenhum objeto (praticamente tudo em Javascript é um objeto).
fonte
Em javascript, todas as variáveis são armazenadas como pares de valores-chave. Cada variável é armazenada como variable_name: variable_value / reference .
indefinido significa que uma variável recebeu um espaço na memória, mas nenhum valor foi atribuído a ela. Como prática recomendada, você não deve usar esse tipo como uma atribuição.
Nesse caso, como indicar quando você deseja que uma variável fique sem valor posteriormente no código? Você pode usar o tipo nulo , que também é usado para definir a mesma coisa, ausência de valor, mas não é o mesmo que o indefinido, pois nesse caso você realmente tem o valor na memória. Esse valor é nulo
Ambos são semelhantes, mas o uso e o significado são diferentes.
fonte
Quero adicionar uma diferença muito sutil entre
null
eundefined
que é bom saber quando você está tentando aprender o Vanilla JavaScript (JS) desde o início:null
é uma palavra-chave reservada em JS, enquantoundefined
é uma variável no objeto global do ambiente de tempo de execução em que você está.Ao escrever o código, essa diferença não é identificável como ambas
null
eundefined
sempre é usada no RHS de uma instrução JavaScript. Mas quando você os usa no LHS de uma expressão, pode observar facilmente essa diferença. Portanto, o interpretador JS interpreta o código abaixo como erro:Dá abaixo erro:
Embora o código abaixo seja executado com êxito, embora eu não recomende isso na vida real:
Isso funciona porque
undefined
é uma variável no objeto global (objeto da janela do navegador no caso de JS do lado do cliente)fonte
undefined='bar'
realmente não atribui nenhum valorundefined
(imutável), apenas não gera um erro confuso.A diferença entre
undefined
enull
é mínima, mas há uma diferença. Uma variável cujo valor éundefined
nunca foi inicializada. Uma variável cujo valor énull
recebeu explicitamente um valor denull
, o que significa que a variável foi definida explicitamente para não ter valor. Se você compararundefined
enull
usando anull==undefined
expressão, eles serão iguais.fonte
null==undefined
étrue
apenas por causa da conversão implícita (ou o termo equivalente em JS). Evidentemente,null===undefined
éfalse
porque usar quando você o usa===
também compara o tipo .Basicamente, Indefinido é uma variável global que o javascript cria no tempo de execução, se nulo significa que nenhum valor foi atribuído à variável (na verdade, nulo é um objeto).
Vamos dar um exemplo:
Indefinido é o que você obterá como saída.
Agora,
e você receberá 5 como saída. Essa é a principal diferença entre Undefined e null
fonte
null - é um valor de atribuição, usado com a variável para representar nenhum valor (é um objeto).
undefined - é uma variável que não possui nenhum valor atribuído a ela, portanto o JavaScript atribui um indefinido a ela (é um tipo de dados).
não declarado - Se uma variável não é criada, é conhecida como não declarada.
fonte
Veja isso. A saída vale mais que mil palavras.
Veja também:
Felicidades!
fonte
isNaN(null)
retornosfalse
- o que me surpreendeu.Ambos os valores especiais implicam um estado vazio.
A principal diferença é que indefinido representa o valor de uma variável que ainda não foi inicializada, enquanto nulo representa uma ausência intencional de um objeto.
Em outros casos, você sabe que uma variável espera reter um objeto ou uma função para retornar um objeto. Mas, por algum motivo, você não pode instanciar o objeto. Nesse caso, nulo é um indicador significativo de um objeto ausente.
Por exemplo, clone () é uma função que clona um objeto JavaScript simples. Espera-se que a função retorne um objeto:
No entanto, clone () pode ser chamado com um argumento não-objeto: 15 ou nulo (ou geralmente um valor primitivo, nulo ou indefinido). Nesse caso, a função não pode criar um clone, portanto retorna nulo - o indicador de um objeto ausente.
fonte
Além de um significado diferente, existem outras diferenças:
null
mas omiteundefined
fonte
Se uma variável não for inicializada, será indefinida. undefined não é um objeto. Exemplo: var MyName; console.log (typeof MyName);
Verifique a ferramenta de desenvolvimento de logon do console, ela será impressa como indefinida.
nulo é um objeto. Se você deseja que alguma variável seja nula, então nulo é usado. existe uma variável nula, mas o valor não é conhecido. null não é inicializado automaticamente.
Exemplo: var MyName = null; console.log (typeof MyName); Verifique a ferramenta de desenvolvimento csole log in, será um objeto.
fonte