O que exatamente indefinido significa em JavaScript? Por que está aí? Que usos ele tem? Como isso poderia ser útil?

11

Em JavaScript, temos algo chamado indefinido . Eu disse alguma coisa, porque realmente não sei se é uma classe base, ou uma variável interna, ou uma palavra-chave, ou qualquer outra coisa. Eu apenas sei que está lá.

Para vê-lo em ação, você pode simplesmente escrever:

undefined;
typeof undefined;

Alguém pode me explicar por que essa coisa foi inserida no JavaScript? Temos nullvalor nessa linguagem, portanto não deve ser algo parecido null. Em outros idiomas, quando não sabemos o valor de uma propriedade ou variável, simplesmente o definimos como nulo. Aqui podemos fazer a mesma coisa.

Como podemos usar essa coisa em JavaScript?

Saeed Neamati
fonte
Isso foi discutido ad nauseum aqui stackoverflow.com/questions/6999291/…
Paul

Respostas:

13

Há duas coisas que você precisa entender sobre indefinido ...

  • o tipo undefined que pode ter apenas um valor .
  • a variável undefined

Agora leia o seguinte com muito cuidado ...

  • Existem muitos valores do tipo number(10, 10.01, 1e1). Mas só pode haver um valor do tipo undefined, e esse valor é armazenado na variável undefined. Esse valor tem representação NO literal - por exemplo, valores numéricos 1, 100, 1e-1são todos literais de número do tipo, mas o valor armazenado na variável undefinednão tem forma literal.

  • undefinedé uma variável, apenas uma variável normal, que o JavaScript declara e atribui o valor do tipo undefinedno escopo global. Então você pode fazer o seguinte ...

  tipo de indefinido; // "Indefinido"

  indefinido = 100;
  tipo de indefinido; // "número"

  indefinido = nulo 0;
  tipo de indefinido; // "Indefinido"

  window.undefined === indefinido; // verdade
  window.undefined === void 0; // verdade
  
  • se você não quiser usar a variável undefined, poderá gerar o valor do tipo undefinedpela expressão void 0- cujo único objetivo é retornar um valor do tipo undefined.

... alguém pode me explicar por que essa coisa foi inserida no JavaScript ...

NÃO. Assim como ninguém pode explicar por que variáveis ​​não declaradas vão para o escopo global em vez de local. Você só precisa treinar-se para usá-lo de maneira inteligente , em vez de tentar encontrar justificativas para sua existência.

... temos valor nulo ...

Embora nullpossa fazer as coisas undefined, é mais ou menos relacionado a objectsescalares do que a escalares. De fato, o JavaScript se considera nullum objeto - typeof nullretorna "objeto".

Na minha opinião, a linha inferior é NÃO tentar raciocinar os propósitos absolutos de undefinede null- e usá-los de maneira inteligível, para que seu código seja legível, sustentável e reutilizável.

codificador de árvore
fonte
2
Boa explicação @greengit. the bottom line is to NOT try to reason the absolute purposes of undefined and null, parece que o JavaScript está longe de ser uma linguagem lógica e simplesmente precisamos nos acostumar, como experimentar um novo mundo.
Saeed Neamati
1
"cujo único objetivo é retornar um valor do tipo undefined". Realmente voidavalia uma expressão, desconsidera o valor de retorno e retorna o undefinedvalor. Quanto às diferenças. undefinedé usado pelo mecanismo JS para dizer que isso não tem valor. nullé usado por você para dizer que essa coisa não tem valor. Existe uma distinção clara .
Raynos 15/08/11
1
undefined = 100; typeof undefined;retorna "indefinido" para mim, se você tentar atribuir a nulo, receberá um erro. Só queria esclarecer isso para futuros leitores.
Josh Rumbut
6

Desculpe por responder a uma pergunta mais antiga, mas a razão pela qual você precisa de indefinido e nulo é simples: em uma linguagem de digitação de pato baseada em protótipo, é absolutamente necessário diferenciar entre "este objeto não define um valor para X" e "este objeto diz que X é nada / nulo / vazio ".

Sem essa capacidade, não há como percorrer a cadeia de protótipos e, portanto, a herança não pode funcionar; você deve ser capaz de determinar que obj.someProp é indefinido, para que possa olhar para obj.prototype.someProp e prosseguir na cadeia até encontrar um valor. Se obj.someProp retornasse nulo, não haveria como saber se realmente era nulo ou apenas significava "olhar para o meu protótipo". A única maneira de contornar isso é injetar alguma magia esfarrapada nos bastidores, o que interrompe sua capacidade de mexer nas cadeias de protótipos e fazer vários outros pedaços de magia negra JS.

Como grande parte do Javascript, a ideia de indefinido e nulo parece instável e estúpida no começo, depois absolutamente brilhante depois (depois volta ao instável e estúpida, mas com uma explicação razoável).

Um idioma como C # não será compilado se você acessar uma propriedade que não existe e outros idiomas dinâmicos geralmente lançam exceções em tempo de execução quando você toca em uma propriedade que não existe, o que significa que você deve usar construções especiais para testá-las. Classes Plus significa que quando um objeto é instanciado, você já conhece sua cadeia de herança e todas as propriedades que ele possui - em JS, eu posso modificar um protótipo 15 passos acima da cadeia e essas alterações aparecerão nos objetos existentes.

russbishop
fonte
3

Existe uma variável global undefined, definida como o valor indefinido. Pessoas más podem defini-lo para outra coisa, então provavelmente é melhor não confiar nisto.

  • O valor indefinido é o valor de retorno de uma função que não retorna um valor.
  • O valor indefinido é o valor de uma variável que não foi atribuída.
  • O valor indefinido é o valor de um parâmetro que não foi passado.
  • O valor indefinido é o valor de uma propriedade que não foi atribuída.
  • 'indefinido' é o tipo de uma variável não declarada. ( typeof undeclaredVariable == 'undefined'. tentar ler o valor de uma variável subfinida fará com que você jogue fora ReferenceError.)

nullestá sutilmente quebrado, porque typeof null == 'object'. Não sei por que temos undefinede null, provavelmente, algum acidente histórico.

Sean McMillan
fonte
2

Bem, undefinedé um valor sentinela obtido pela avaliação de algo que não está definido em oposição a null, que é o valor exatamente definido para representar nada .

var o = { };
> undefined
o
> Object {}
o.foo
> undefined
function f() {}
> undefined
function r() { return null; }
> undefined
f()
> undefined
r()
> null

Assim, por exemplo, o valor de retorno de uma função, que não define um valor de retorno, é indefinido. O valor de uma propriedade não definida em um objeto é indefinido. O valor de retorno de uma instrução, que não é uma expressão, é indefinido (embora você não veja isso ocorrer além do console).
Por favor, note que você pode criar uma função, que explicitamente retornos undefinede você pode definir explicitamente uma propriedade com o valor undefinedem um objeto, porque no final é um valor válido. Você faria isso para comunicar explicitamente que algo não está definido .

Você poderia pensar na relação de undefinede nullcomo entre NaNe 0.

back2dos
fonte
"O valor de retorno de uma função, que não define um valor de retorno é indefinido", que quer dizer que undefinedé void?
Saeed Neamati
@ Saeed: Não é bem assim. voidem JavaScript é um operador unário , que aceita qualquer argumento e retorna o valor undefined .
Aug2