Cosa significa esattamente non definito in JavaScript? Perché è lì? Che usi ha? Come potrebbe essere utile?


11

In JavaScript, abbiamo qualcosa chiamato indefinito . Ho detto qualcosa, perché non so davvero se si tratta di una classe di base, di una variabile incorporata, di una parola chiave o altro. So solo che è lì.

Per vederlo in azione, puoi semplicemente scrivere:

undefined;
typeof undefined;

Qualcuno può spiegarmi perché questa cosa è stata inserita in JavaScript? Abbiamo nullvalore in questa lingua, quindi non dovrebbe essere qualcosa del genere null. In altre lingue, quando non conosciamo il valore di una proprietà o variabile, lo impostiamo semplicemente su null. Qui possiamo fare la stessa cosa.

Come possiamo usare questa cosa in JavaScript?



Questo è stato discusso fino alla nausea qui stackoverflow.com/questions/6999291/…
Paul

Risposte:


13

Ci sono DUE cose che devi capire su non definito ...

  • il tipo undefined che può avere un solo valore .
  • la variabile undefined

Ora leggi attentamente quanto segue ...

  • Ci sono così tanti valori di tipo number(10, 10.01, 1e1). Ma può esserci un solo valore di tipo undefinede quel valore è memorizzato nella variabile undefined. Tale valore è NO rappresentazione letterale - per esempio, valori numerici 1, 100, 1e-1sono tutte letterali di tipo numero, ma il valore memorizzato nella variabile undefinednon ha forma letterale.

  • undefinedè una variabile, solo una normale, che JavaScript dichiara e le assegna il valore di tipo undefinednell'ambito globale. Quindi puoi fare tutto quanto segue ...

  tipo di indefinito; // "non definito"

  undefined = 100;
  tipo di indefinito; // "numero"

  undefined = void 0;
  tipo di indefinito; // "non definito"

  window.undefined === undefined; // vero
  window.undefined === void 0; // vero
  
  • se non si desidera utilizzare la variabile undefined, è possibile generare il valore di tipo undefineddall'espressione void 0, il cui unico scopo è restituire un valore di tipo undefined.

... qualcuno può spiegarmi perché questa cosa è stata inserita in JavaScript ...

NO. Proprio come nessuno può spiegare perché le variabili non dichiarate vadano nell'ambito globale anziché locale. Devi solo allenarti ad usarlo in modo intelligente invece di cercare di trovare giustificazioni per la sua esistenza.

... abbiamo valore nullo ...

Anche se nullpuò fare le cose undefined, è più o meno correlato objectspiuttosto che scalare. In effetti, JavaScript si considera nullun oggetto - typeof nullrestituisce "oggetto".

A mio avviso, la linea di fondo è NON cercare di ragionare sugli scopi assoluti di undefinede null- e di usarli nel tuo codice in modo intelligibile, in modo che il tuo codice sia leggibile, mantenibile e riutilizzabile.


2
Buona spiegazione @greengit. the bottom line is to NOT try to reason the absolute purposes of undefined and null, sembra che JavaScript sia un po 'più piccolo dell'essere un linguaggio logico e dobbiamo semplicemente abituarci, come sperimentare un nuovo mondo.
Saeed Neamati,

1
"il cui unico scopo è restituire un valore di tipo undefined". voidValuta effettivamente un'espressione, ignora il valore restituito e restituisce il undefinedvalore. Per quanto riguarda le differenze. undefinedviene utilizzato dal motore JS per dire che questa cosa non ha alcun valore. nullè usato da TE per dire che questa cosa non ha valore. C'è una chiara distinzione.
Raynos,

1
undefined = 100; typeof undefined;restituisce "undefined" per me, se si tenta di assegnare a null si ottiene un errore. Volevo solo chiarirlo per i futuri lettori.
Josh Rumbut,

6

Ci scusiamo per rispondere a una domanda più anziani, ma la ragione è necessario sia indefinito e nulla è semplice: in una lingua d'anatra tipizzazione basata sui prototipi è assolutamente necessario distinguere tra "questo oggetto non definisce un valore per X" e "questo oggetto dice X è niente / null / vuoto".

Senza questa capacità non c'è modo di percorrere la catena di prototipi e quindi l'eredità non può funzionare; devi essere in grado di determinare che obj.someProp è indefinito in modo da poter guardare obj.prototype.someProp e proseguire su per la catena fino a trovare un valore. Se obj.someProp restituisse null non ci sarebbe modo di sapere se fosse davvero nullo o significasse semplicemente "guarda il mio prototipo". L'unico altro modo per aggirare questo è iniettare un po 'di magia kludgy dietro le quinte che spezza la tua capacità di fuzz con le catene prototipo e fare vari altri pezzi di magia nera JS.

Come gran parte di Javascript, l'idea di indefinito e nullo sembra inizialmente traballante e stupida, poi in seguito assolutamente geniale (poi torna a stupida e stupida ma con una spiegazione ragionevole).

Un linguaggio come C # non verrà compilato se si accede a una proprietà che non esiste e altri linguaggi dinamici spesso generano eccezioni in fase di esecuzione quando si tocca una proprietà che non esiste, il che significa che è necessario utilizzare costrutti speciali per testarli. Inoltre, le classi indicano che quando un oggetto viene istanziato, conosci già la sua catena di eredità e tutte le proprietà che ha - in JS posso modificare un prototipo di 15 passaggi lungo la catena e tali modifiche appariranno sugli oggetti esistenti.


3

C'è una variabile globale undefined, che è impostata sul valore non definito. Le persone malvagie possono impostarlo su qualcos'altro, quindi probabilmente è meglio non fidarsene.

  • Il valore non definito è il valore restituito di una funzione che non restituisce un valore.
  • Il valore indefinito è il valore di una variabile che non è stata assegnata.
  • Il valore indefinito è il valore di un parametro che non è stato passato.
  • Il valore non definito è il valore di una proprietà che non è stata assegnata.
  • 'undefined' è il tipo di una variabile non dichiarata. ( typeof undeclaredVariable == 'undefined'. provare a leggere il valore di una variabile sottotitolata ti farà sballare ReferenceError.)

nullè sottilmente rotto, perché typeof null == 'object'. Non so perché abbiamo undefinede null, probabilmente, un incidente storico.


2

Bene, undefinedè un valore sentinella ottenuto valutando qualcosa che non è definito in contrapposizione null, che è il valore esattamente definito per non rappresentare nulla .

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

Ad esempio, il valore restituito di una funzione che non definisce un valore restituito non è definito. Il valore di una proprietà non definita su un oggetto non è definito. Il valore restituito di un'istruzione, che non è un'espressione, non è definito (anche se non vedrai che ciò si verifica se non nella console).
Si noti che è possibile creare una funzione che ritorni esplicitamente undefinede che sia possibile definire esplicitamente una proprietà con il valore di undefinedsu un oggetto, poiché alla fine è un valore valido. Lo faresti per comunicare esplicitamente che qualcosa non è definito .

Potresti pensare alla relazione di undefinede nullcome quella tra NaNe 0.


"Il valore restituito di una funzione, che non definisce un valore restituito, non è definito", vuoi dire che lo undefinedè void?
Saeed Neamati,

@Saeed: Non proprio. voidin JavaScript è un operatore unario , che accetta qualsiasi argomento e restituisce il valore undefined .
back2dos,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.